Einige Systeme ermöglichen es dem Terminalbenutzer ein NUL Byte eingeben, indem Sie Ctrl - @. scanf()
würde dann dieses Byte in das Zielarray speichern, würde aber höchstwahrscheinlich nicht berücksichtigen, dass dieses Byte ein Worttrennzeichen darstellt, so dass das Eingabe-Parsing fortgesetzt wird, bis das Ende der Datei oder ein Leerzeichen wie Newline eingegeben wird.
Es gibt keine Möglichkeit, vom Ziel-Array zu unterscheiden, ob ein NUL-Byte nach anderen Zeichen gespeichert wurde oder genau, wie viele weitere Zeichen nach diesem NUL-Byte gelesen wurden. Aber wenn scanf()
zurückgegeben 1
und msg
hat eine Länge von Null, ist die einzige Möglichkeit, dass der Benutzer ein NUL-Byte nach einer möglicherweise leeren Folge von Leerzeichen eingegeben.
Dies würde auch die einzige Möglichkeit für fgets()
sein, einen leeren String zurück, wenn eine Ziel-Array mit einer Größe übergeben größer als 1
Wenn Eingabe aus einer Datei anstelle eines Terminal gelesen wird, ist es immer ein Möglichkeit, dass die Datei NUL-Bytes enthält und Vorsicht geboten ist, um ein undefiniertes Verhalten zu vermeiden, falls dies geschieht. Zum Beispiel, hier ist ein klassischer Fehler:
char msg[1000];
if (fgets(msg, sizeof msg, stdin)) {
int len = strlen(msg);
if (msg[len - 1] == '\n') { // potential undefined behavior!
msg[--len] = '\0' // potential undefined behavior!
}
...
}
Beachten Sie auch, dass Ihr Code einen Fehler hat: die maximale Anzahl von Zeichen in das Ziel zu speichern, sollte 999
, nicht 1000
sein:
char msg[1000];
if (scanf("%999s",msg) == 1) {
/* word was read from the user */
if (*msg == '\0') {
printf("user entered a NUL byte\n");
}
}
Für das ['scanf'] (http://en.cppreference.com/w/c/io/fscanf) -Format' "% s" 'muss * eine * Nicht-Leerzeichen-Eingabe sein. Wenn Sie eine optionale Eingabe wünschen, verwenden Sie stattdessen ['fgets'] (http://en.cppreference.com/w/c/io/fgets). –
@Someprogrammerdude Ich kann nicht fgets verwenden, es muss scanf sein –
Dann müssen Sie mit den Einschränkungen leben, nicht in der Lage zu sein, eine nicht leere Eingabe zu geben. –