fprintf()
famiglia di funzioni hanno 5 bandiera caratteri '-'
, '+'
, ' '
, '#'
, '0'
.Qual è il comportamento quando viene ripetuto un flag identificatore printf?
Qual è il comportamento specificato, se presente, quando un flag è ripetuto?
#include <stdio.h>
int main(void) {
printf("% d\n", 12); // 12
printf("%00d\n", 34); // 34
printf("%++d\n", 56); // +56
printf("%00*d\n", 5, 78); // 00078
return 0;
}
Con il mio gcc "i686-pc-cygwin/4.9.2" ricevo "attenzione: ripetuto '' bandiera in formato [-Wformat =]", quindi suppongo che questo è un comportamento corretto -> avvisare l'utente e consentire il flag ripetuto.
Devo ancora trovare una guida alle specifiche C99/C11 per questo problema d'angolo trovato durante il tentativo di scrivere un parser di formato.
Se il ripetuto è consentito, il seguente codice è OK. Se il ripetersi non è consentito, il 2 ° 0
è la larghezza. Quindi lo specificatore ha 2 larghezze 0
e *
, che è un altro problema.
// -------v
printf("%00*d\n", 5, 78); // 00078
FWIW, ottengo gli stessi risultati su VS 2008 e VS 2010. –
Certamente non è richiesto alcun avviso, anche per una stringa di formato errata. Le stringhe di formato possono essere costruite in fase di esecuzione; nel caso generale, il compilatore non può dire se è corretto. Alcuni compilatori, come gcc, avvertono di una stringa di formato errata quando è letterale (il caso più comune). (Questo non risponde alla tua domanda se sono permessi i flag ripetuti.) –
Ho visto alcune implementazioni di 'printf' e ne ho scritte almeno 4 diverse. Gestiscono tutti i flag ripetuti come equivalenti a un singolo flag, per la semplice ragione che è molto più semplice farlo e per i pochi implementatori che si chiedono a riguardo, non sembra essere errato. – chqrlie