Wie kann Sie zulassen, dass Leerzeichen eingegeben werden, die Verwendung von scanf?
Verwenden Sie den folgenden code:
char *name = malloc(sizeof(char) + 256);
printf("What is your name? ");
scanf("%s", name);
printf("Hello %s. Nice to meet you.\n", name);
Kann ein Benutzer geben Sie Ihren Namen, aber wenn Sie einen Namen eingeben mit einem Leerzeichen wie Lucas Aardvark
, scanf()
gerade schneidet alles nach Lucas
. Wie mache ich scanf()
ermöglichen Räume
- Beachten Sie, dass mehr idiomatisch ist 'malloc(sizeof(char) * 256 + 1) "oder" malloc(256 + 1)', oder noch besser (vorausgesetzt 'name' verwendet, wird streng lokal) 'char name[256+1]'. Das '+1' als mneumonic für den null-terminator, das muss einbezogen werden in die Zuteilung.
- Ich vermute
sizeof(char) + 256
war ein Tippfehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Menschen (und besonders Anfänger) sollten nie
scanf("%s")
odergets()
oder andere Funktionen, die nicht über buffer-overflow-Schutz, es sei denn, Sie wissen sicher, dass der Eingang wird immer von einem bestimmten format (und vielleicht nicht einmal dann).Erinnern, als
scanf
steht für "scan formatted" und es gibt herzlich wenig weniger formatiert als Benutzer-Daten eingegeben. Es ist ideal, wenn Sie haben die totale Kontrolle über die input-Daten-format, aber im Allgemeinen nicht für Benutzereingaben.Verwenden
fgets()
(die hat buffer-overflow-Schutz), um Ihre Eingabe in einen string undsscanf()
zu bewerten. Da Sie nur das wollen, was der Benutzer eingegeben, ohne Analyse, die Sie nicht wirklich brauchensscanf()
in diesem Fall sowieso:fgets()
. Es sieht tatsächlich einfacher zu verwenden, dannscanf()
. +1scanf
hat Undefiniertes Verhalten, wenn numerische Konvertierung überläuft (N1570 7.21.6.2p10, letzter Satz, die Formulierung unverändert seit C89) was bedeutet keiner derscanf
Funktionen kann sicher verwendet werden für numerische Umwandlung von nicht vertrauenswürdigen Eingaben.scanf
in einer Zuordnung, Sie waren falsch, so zu tun, und Sie können sagen Sie Ihnen, ich sagte ja, und wenn Sie wollen streiten mit mir über mein E-Mail-Adresse ist leicht zu finden mein Profil ab.name[strcspn(name, "\n")] = '\0';
arbeitet korrekt für alle Daten Lesen, indemfgets()
wenn es nicht geben Sie einen NULL-Zeiger (zeigen EOF oder Fehler) — ohne Notwendigkeit-Bedingungen in Ihrem code.Versuchen
Hoffe, das hilft.
scanf()
akzeptiert regex ' s! Danke!!!!!"%[^\n]"
als format-strings
im format-string?s
aus dem Ende der Eingabezeichenfolge, da es sowohl überflüssig und falsch in bestimmten Fällen (wie bereits in früheren Kommentaren).[
ist es eigenen - Formatbezeichner, anstatt eine variation ders
ein.In diesem Beispiel verwendet eine invertierte scanset, so scanf hält die Werte bis es auf ein '\n'-- newline, so Räumen gerettet werden, als auch
%20[^\n]s
Pufferüberläufe zu verhinderns
es!Können Sie diese
Oder diese
DEMO
scanf("%19[^\n]", name);
(trotzdem +1 für die knappe Antwort)sizeof(char)
per definition ist immer 1, so gibt es keine Notwendigkeit, sich zu vermehren, indem Sie es.Nicht verwenden
scanf()
zum Lesen von Zeichenfolgen ohne Angabe einer Feldbreite. Sie sollten auch prüfen die Rückgabewerte auf Fehler:Nutzen Sie alternativ
fgets()
:Können Sie die
fgets()
Funktion zum Lesen einer Zeichenkette oder verwenden Siescanf("%[^\n]s",name);
also string Lesung endet mit der Begegnung mit einem newline-Zeichen.s
dort nicht hin gehörtgetline()
Nun ein Teil des POSIX-keiner-der-weniger.
Er kümmert sich auch um den buffer allocation problem, dass Sie gefragt haben früher, obwohl Sie zu kümmern
free
ing Speicher.Wenn noch jemand sucht, hier ist was für mich gearbeitet - zum Lesen einer beliebigen Länge der Zeichenfolge, einschließlich Leerzeichen.
Dank der vielen Plakate, die auf dem web für den Austausch dieser einfachen & elegante Lösung.
Wenn es funktioniert der Kredit geht an Sie, aber alle Fehler sind meine.
errno
und Reinigung der zugeteilten Speicher.s
dort nicht hin gehört nach dem scansetKönnen Sie verwenden
scanf
für diesen Zweck mit einem kleinen trick. Eigentlich sollte man die Benutzereingaben ermöglichen, bis der Benutzer trifft Sie die EINGABETASTE (\n
). Dabei werden alle Zeichen, einschließlich space. Hier ist ein Beispiel:Wie das funktioniert? Wenn der Benutzer die Eingänge Zeichen von der Standardeingabe, Sie werden gespeichert in Zeichenfolge die variable bis zur ersten leeren Raum. Danach, für den rest der Eintrag bleibt im input-stream, und warten Sie für die nächste scanf. Als Nächstes haben wir eine
for
Schleife, dauert char durch char von input-stream (bis\n
) und apends Sie zu Ende des string - variable, wodurch ein kompletter string gleich als Benutzereingabe von der Tastatur.Hoffe, dies hilft jemand!
Während Sie sollten wirklich nicht benutzen
scanf()
für diese Art der Sache, weil es gibt viel bessere Anrufe wiegets()
odergetline()
es getan werden kann:gets
wurde als veraltet markiert und entfernt (stackoverflow.com/questions/30890696/why-gets-is-deprecated) aus dem standard. Es ist sogar schlimmer, diescanf
weil zumindest letzteres hat Möglichkeiten, um es sicher.s
dort nicht hin gehört nach dem scanset