Die Schlacht von zwei Verlierer: "%s"
gegen "%[^\n]s"
:
Beide Bezeich sind schlecht und gehören nicht robust Code. Weder beschränkt die Benutzereingabe und kann den Zielpuffer leicht überlaufen.
Die s
in "%[^\n]s"
dient keinem Zweck. @Jonathan Leffler. So wird "%[^\n]"
überprüft, das ist immer noch schlecht.
"%s"
verbraucht führenden Leerraum. "%[^\n]"
nicht @Igor Tandetnik
"%[^\n]"
liest nichts, wenn die Hauptfigur ein '\n'
ist, a
unverändert oder nur selten in einem unbekannten Zustand zu verlassen.
"%[^\n]"
liest alle Zeichen außer '\n'
.
"%s"
liest alle führenden Leerzeichen, verwirft sie und liest und speichert alle Nicht-Leerstellen.
Bessere fgets()
zu verwenden, um Benutzereingabe zu lesen und es dann analysieren.
Beispiel: eine Eingabezeile, einschließlich Leerzeichen zu lesen:
char a[100];
if (fgets(a, sizeof a, stdin) == NULL) Handle_EOF_or_Error();
// if the potential trailing \n is not wanted
a[strcspn(a, "\n")] = '\0';
Sie Sie die Bösartigkeit von 'scanf' erkennen, und dass Sie sollten stattdessen' std :: cin' benutzen? –
'% s' verwirft führende Leerzeichen,'% [set] 'nicht. Beim ersten Aufruf lesen Sie bis zum Zeichen "\ n", aber nicht, das im Stream verbleibt. Beim zweiten Aufruf kann '% [^ \ n]' kein beliebiges Zeichen abrufen, da das erste Zeichen '\ n' ist. –
probiere '"% 99 [^ \ n] "' - beachte das Leerzeichen am Anfang des Strings (um Whitespace zu ignorieren) und das Limit von 99 Zeichen (um den Puffer nicht zu überlaufen). –