Mi piacerebbe sscanf una linea e assicurarsi che non ci sia nulla di più di ciò che volevo. Il codice è simile al seguente:Come sscanf per assicurarsi che il buffer sia esattamente quello che volevo?
void parse_init_command(char *buffer, command *new_command) {
if (sscanf(buffer,
"%s %d %d %d %d %d %d %d\n",
new_command->name,
&new_command->data[0],
&new_command->data[1],
&new_command->data[2],
&new_command->data[3],
&new_command->data[4],
&new_command->data[5],
&new_command->data[6]) != 8) {
strncpy(new_command->name, "WRONG_INPUT", 15);
}
}
Quando ottengo un ingresso come:
INIT 9 11 3 1 1 1 9
tutto è andato bene, ma poi un ingresso come questo
INIT 9 11 3 1 1 1 9 s
è anche accettato. Ho pensato che se avessi aggiunto "\ n" tutto funzionerebbe bene, poiché so che ogni riga di input termina con un EOL, ma non è così.
'scanf' tratta il carattere di nuova riga come spazio bianco, proprio come le schede e gli spazi. Si può leggere un nono valore fittizio, una stringa breve con massimo forzato. width ('% 2s') forse, e imporre che il numero di conversioni non superi 8. –
Il buffer è inizializzato prima di essere passato in questa funzione? – bentank