2012-03-30 14 views
8

Che cos'è %*d? So che %d viene utilizzato per integers, quindi penso che %*d deve anche in relazione al numero intero solo? Qual è lo scopo di questo? Che cosa fa?Qual è la differenza tra% d e% * d in linguaggio c?

int a=10,b=20; 
printf("\n%d%d",a,b); 
printf("\n%*d%*d",a,b); 

risultato è

10 20 
1775 1775 
+4

Sembra un identificatore di larghezza: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Mysticial

+2

@Mysticial Dovresti scrivere quello come risposta .. – Ben

+0

@Ben, è solo un collegamento - che non si qualificano come una risposta. Sono troppo pigro per ampliarlo ... – Mysticial

risposta

10

Quando usati con scanf funzioni(), significa che un numero intero viene analizzato, ma il risultato non è memorizzato ovunque.

Se utilizzato con le funzioni printf(), significa che l'argomento larghezza è specificato dall'argomento di formato successivo.

5

Il simbolo * viene usato come indicazione che la larghezza viene passato come parametro di printf

+1

Quindi, perché produce output 1775 1775? – Parag

+1

printf è una funzione di argomenti variabili, in modo che quando la stringa di formato viene analizzata, esso cerca un numero intero che rappresenta la larghezza del primo valore, il valore stesso, la larghezza del secondo valore e il secondo valore. Poiché stai trasmettendo solo 2 valori, i valori utilizzati non sono definiti. Prova a utilizzare 4 valori significativi e guarda il risultato. – guga

17

Il %*d in printf consente di utilizzare una variabile per controllare l'ampiezza del campo, lungo le linee di:

int wid = 4; 
printf ("%*d\n", wid, 42); 

che vi darà:

..42 

(con ciascuno di quelli 0.123.caratteri essendo uno spazio). Il * consuma un argomento wid e la d consuma il 42.

La forma si dispone, come:

printf ("%*d %*d\n", a, b); 

è un comportamento indefinito come da standard, in quanto si dovrebbe essere fornendo quattro argomenti dopo la stringa di formato, non due (e buoni compilatori come gcc vi dirà a questo proposito se si alza il livello di avviso). Da C11 7.20.6 Formatted input/output functions:

Se non ci sono argomenti sufficienti per il formato, il comportamento non è definito.

Dovrebbe essere qualcosa di simile:

printf ("%*d %*d\n", 4, a, 4, b); 

E la ragione che stai ricevendo l'uscita strana è dovuto a che un comportamento indefinito. This excellent answer mostra il tipo di cose che possono andare storte (e perché) quando non si seguono le regole, in particolare relative a questa situazione.

Ora non mi aspetto che questo sia un problema di disallineamento dal momento che si sta utilizzando int per tutti i tipi di dati, ma, come per tutti un comportamento indefinito, nulla può accadere.

+1

+1 per "Questa eccellente risposta" ... :) – guga

+0

spiegazione fine. :) – barnes

Problemi correlati