Wie lese ich einen vom Benutzer eingegebenen Zeichenfolge in C?
Möchte ich Lesen den Namen eingegeben von meinem user, der sich mit C-Programmen.
Dazu schrieb ich:
char name[20];
printf("Enter name: ");
gets(name);
Aber mit gets
ist nicht gut, so was ist eine bessere Möglichkeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nie Verwendung
gets
(oderscanf
mit einem offenen string-Größe) da öffnet Sie bis zu buffer overflows. Verwenden Sie diefgets
mit einemstdin
handhaben, da es ermöglicht es Ihnen, die Daten beschränken, die in den Puffer.Hier ist eine kleine Schnipsel, die ich für line-Eingang vom Benutzer:
Dies ermöglicht es mir, die maximale Größe festzulegen, wird erkennen, ob zu viele Daten eingegeben werden, auf die line, und Spülen Sie den rest der Zeile als gut, so dass es nicht auf die nächste Eingabe.
Testen kann man es mit etwas wie:
scanf("%s")
in ein 20-byte-Puffer, und der Benutzer gibt einen 40-byte-Zeile, du bist abgespritzt. Der springende Punkt bei derscanf
scan-formatiert, und es ist wenig mehr unformatiert als user input 🙂without any parameter that tells the implementation about the size of the destination buffer
?scanf
-wie operation, ich werdefgets
es in einen Puffer, dannsscanf
es von dort.Ich denke, die beste und sicherste Weg, um zu Lesen Saiten durch den Benutzer eingegeben wird, mit
getline()
Hier ist ein Beispiel, wie dies zu tun:
Auf einem POSIX-system, sollten Sie wahrscheinlich verwenden
getline
, wenn es verfügbar ist.Können Sie auch verwenden, Chuck Falkner public-domain
ggets
Funktion, die syntax näher zugets
aber ohne Probleme. (Chuck Falconer ' s website ist nicht mehr verfügbar, obwohl archive.org eine Kopie hat, und ich habe meine eigene Seite für ggets.)\n
.Fand ich eine einfache und schöne Lösung:
es basiert auf der Funktion fgets aber frei von '\n' und stdin zusätzliche Zeichen (ersetzen fflush(stdin), das funktioniert nicht auf allen OS, nützlich, wenn Sie haben, zu erwerben strings nach dieser).
fgetc
stattgetchar
so, dass es mithilfe des mitgeliefertenstream
stattstdin
.Auf BSD-Systemen und Android können Sie auch
fgetln
:Etwa so:
Den
line
ist nicht null-terminiert und enthält\n
(oder was auch immer Ihre Plattform nutzt) am Ende. Es wird ungültig nach dem nächsten I/O-operation auf dem stream. Sie sind berechtigt, ändern Sie den zurückgegebenenline
Puffer.Können Sie verwenden scanf-Funktion zum Lesen string
ich weiß nicht, über andere, bessere Möglichkeiten zu erhalten, string,
scanf
; es ist berüchtigt schwer zu bedienen korrekt. Diese Verwendung ist besonders gefährlich, da es sich nicht beschränken-Eingang und kann leicht überlaufen dername
Puffer.