2015-10-21 12 views
5

Quando uso printf in %*c%*c in printf, richiede 4 valori e stampa anche la somma di 4 e 5. Non ho trovato un motivo valido per questo.Che cos'è% * c% * c in `printf`?

Durante le ricerche, ho trovato che %*c indica la larghezza. Ma cos'è la larghezza e come mai la somma viene ricavata per l'esempio sottostante?

printf("%*c%*c", 4, ' ', 5, ' '); 

Ideone link

Codice:

#include <stdio.h> 

int add(int x, int y) 
{ 
    return printf("%*c%*c",x,' ', y,' '); 
} 

int main() 
{ 
    printf("%d",add(4,5)); 
    return 0; 
} 
+0

Si prega di aggiungere l'intero codice di esempio al tuo post, così come l'output - in questo caso è importante per la risposta! – usr2564301

+1

Si potrebbe voler leggere [un riferimento a 'printf' (e famiglia)] (http://en.cppreference.com/w/c/io/fprintf)? –

+0

Oh e tutto ciò che la chiamata 'printf' che ci fai vedere è di 9 spazi. –

risposta

5

printf("%*c%*c", 4, ' ', 5, ' '); stampa uno spazio in un campo di dimensioni 4 seguito da uno spazio in un campo di dimensioni 5. Quindi un totale di 9 caratteri.

Nel codice scritto, la funzione restituisce il risultato di printf che dà il numero di caratteri a stampa, in modo da 9. In main quindi si stampa questo numero 9.

6

printf restituisce il numero di caratteri stampati.

printf("%*c", N, C); stampe N-1 sbozzati seguiti dal carattere C.

Più in generale, printf stampe N - length_of_text sbozzati (se tale numero è > 0 zero sbozzati altrimenti) seguito dal testo. Lo stesso vale per i numeri.

quindi

return printf("%*c%*c", x, ' ', y, ' '); 

stampa uno spazio prefisso x meno length_of_space altri spazi (x-1), poi fa lo stesso per y. Ciò rende gli spazi 4+5 nel tuo caso. Poi printf restituisce il numero totale di caratteri stampati, 9.

printf("%d",add(4,5)); 

Questa printf stampe il numero intero restituito dalla funzione add(), 9.

Per impostazione predefinita, printf è allineato a destra (gli spazi prima del testo). Per rendere lasciato -aligned, sia

  • dare un negativo N, o
  • aggiungere un - prima della *, per esempio %-*s o
  • funziona anche la versione statica, ad es. %-12s, %-6d
+1

No, 'printf ("% * c ", N, C)' stampa il carattere C in un campo di dimensioni N. –

+0

Proprio così - Ho usato '% XY' circa diecimila volte, non so perché ho scritto inizialmente "N volte" ... –

1

tutto è come previsto. Secondo il formato manual


(opzionale). seguito da numero intero o *, o nessuno che specifica la precisione della conversione.Nel caso in cui * sia utilizzato, la precisione è specificata da un argomento aggiuntivo di tipo int. Se il valore di questo argomento è negativo, viene ignorato. Se non viene utilizzato né un numero né *, la precisione viene considerata pari a zero. Vedi la tabella qui sotto per gli esatti effetti di precisione.

valore di ritorno
1-2) Numero di caratteri scritti se il valore di successo o negativo se si è verificato un errore.

Quindi nel tuo caso:

int add(int x, int y) 
{ 
    return printf("%*c%*c",x,' ', y,' '); 
    //   ^x is for the first *, y for the second * 
} 

Di conseguenza, il numero di x + y spazio (compresa la precisione) scritto, che è il valore di ritorno.