Ultimamente, ho notato uno strano caso desidero verificare:caratteri scritti finora snprintf
da SUS, per %n
in una stringa di formato, il rispettivo int
sarà impostato al-quantità-di-byte -Esame scritto-to-the-uscita. Inoltre, per snprintf(dest, 3, "abcd")
, dest
punterà a "ab\0"
. Perché? Perché non devono essere scritti più di n (n = 3) byte nell'output (il buffer dest
).
ho dedotto che per il codice:
int written;
char dest[3];
snprintf(dest, 3, "abcde%n", &written);
written
sarà impostato su 2 (cessazione nulla escluso dal conteggio). Ma da un test che ho effettuato utilizzando GCC 4.8.1, written
era impostato su 5. Stavo interpretando male lo standard? E 'un errore? È un comportamento indefinito?
Edit:
@wildplasser detto:
... il comportamento di% n nella stringa di formato potrebbe essere definito o implementazione definito ...
E
... l'implementazione deve simulare l'elaborazione della stringa di formato completa (compreso il% n) ...
@par detto:
written
è 5 perché questo è il numero di caratteri si sarebbe scritto nel punto si incontra l'%n
. Questo è un comportamento corretto.snprintf
solo copie fino asize
caratteri meno il nulla finale ...
E:
Un altro modo di guardare a questo è che il
%n
non sarebbero nemmeno stati riscontrati se trattati solo fino a 2 caratteri, quindi è pensabile aspettarsiwritten
di avere un valore non valido ...
E:
... l'intera stringa è trasformati tramite
printf()
regole, poi viene applicata la massima lunghezza ...
Può essere verificata essere lo standard, uno standard di correnti o di qualche fonte ufficiale?
Mi sembra un errore (nell'implementazione della libreria). – pmg
Mi aspetto che dovresti * prima * guardare il valore di ritorno da snprintf(). Gli "effetti collaterali" sono diversi; il comportamento di '% n' nella stringa di formato potrebbe essere indefinito o definito dall'implementazione se il valore di ritorno è> = il secondo argomento. In ogni caso, l'implementazione deve * simulare * l'elaborazione della stringa di formato * complete * (incluso '% n') per ottenere il valore di ritorno corretto, in modo che l'effetto collaterale possa essere ottenuto al volo. – wildplasser