2013-08-26 19 views
8

Stavo leggendo il classico K & R e incontrato la seguente sintassi:?Significato di "." in printf

printf("%.*s",max,s); 

Qual è il significato di "." qui Quando non applico una "." qui, poi tutta la stringa viene stampata, ma quando non applichiamo un ".", vengono stampati i caratteri massimi di massima. Sarò davvero grato se qualcuno potrebbe spiegarlo.

+1

Hai letto lo standard C? Specifica come dovrebbe funzionare ... – DCoder

+3

@DCoder Avendo lavorato molto con lo standard C, sono sicuro che non è possibile * leggerlo *. –

+0

@NikolaiRuhe: questo può essere vero per alcune * parti * dello standard, ma trovo che la sezione che descrive 'printf' sia abbastanza leggibile. – DCoder

risposta

11

In %.*s, il numero .* limita il numero di byte che verranno scritti. Se questo fosse scritto con un numero incluso, come %.34s, il numero sarebbe il limite. Quando viene utilizzato un asterisco, il limite viene preso dall'argomento corrispondente a printf.

Da C 2011 (N1570) 7.21.6.1 4, che descrivono le specifiche di conversione per fprintfet al:

Una precisione opzionale che dà ... il numero massimo di byte da scrivere per s conversioni . La precisione assume la forma di un periodo (.) seguito da un asterisco * (descritto in seguito) o da un numero intero decimale facoltativo; se viene specificato solo il periodo, la precisione viene considerata pari a zero.

+0

Si potrebbe voler scrivere "in'%. * S', la parte '. *' Limiti ... "altrimenti è un po 'difficile da leggere. – Veltas

+0

Sostituire "numerale" con "intero" o "numero". – Veltas

+0

@Veltas: Grazie, inserisco "il" prima di '. *'. Per quanto riguarda numeri e numeri, numeri interi e numeri sono oggetti matematici. Un numero è simboli (in particolare una stringa di cifre) che denota un numero. Quindi "34" è un numero e non è un numero, allo stesso modo "lupo" è una parola e non è un animale. –

11

specifica la "stringa di caratteri ampiezza del campo massima"

La precisione di un formato di stringa specifica la larghezza massima del campo:

%2.6s

specifica una larghezza minima di 2 ed un massimo larghezza di 6 caratteri. Se la stringa è maggiore di 6 caratteri, verrà troncata.

4

Una stringa di formato printf consente di specificare larghezza e precisione.

Larghezza, ad esempio %25s, indica printf per riempire la stringa alla larghezza di 25 caratteri, inserendo spazi prima della stringa. (Se la stringa è più larga di 25 caratteri, è ancora stampata nella sua interezza.)

Una "precisione" applicata a un formato di stringa, come %.25s, limita la lunghezza della stringa stampata a 25 caratteri. Una stringa di 3 caratteri verrà stampata completamente (senza riempimento) e una stringa di 30 caratteri mancherà dei suoi ultimi cinque caratteri.

%.*s evita l'hardcoding della precisione nel formato, specificandolo invece come argomento intero su printf, nel tuo caso max.

+0

"Non noto al momento in cui il formato è scritto," cosa significa? – Veltas

+0

@Veltas Quando scrivi un formato come '% .25s', sai che avrai bisogno di una precisione di 25 caratteri. Quando scrivi '%. * S', lasci la precisione indeterminata fino al momento dell'esecuzione. Proverò a chiarire la risposta. – user4815162342

2

Prima di tutto, K & R è l'implementazione originale di C, che è diversa dalla specifica corrente. Se desideri informazioni specifiche su K & R C, consulta la documentazione specifica.

Dalla attuale standard di C:

Una precisione opzionale che dà (...) il numero massimo di byte da scrivere per le conversioni s. La precisione assume la forma di un punto (.) seguito da un asterisco * (descritto più avanti) o da un numero intero decimale facoltativo.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

documentazione analoga è disponibile in tutto il mondo on-line per gli standard multipli o implementazioni:

1

Il punto ha un significato diverso con stringhe di diverso formato. Se usi a.b con% f, b dà la lunghezza. a dà il numero di punti decimali. se usi a.b con% s, a darà la lunghezza minima della stringa. mentre b dà la lunghezza massima della stringa che verrà stampata.