Was ist die Wirkung der nachgestellten Leerzeichen im scanf () - format-string?
Was ist der Unterschied zwischen scanf("%d")
und scanf("%d ")
in diesem code, wo der Unterschied ist die nachfolgende leere im format-string?
#include <stdio.h>
int main(void)
{
int i, j;
printf("enter a value for j ");
scanf("%d ",&j);
printf("j is %d\n", j);
printf("enter a value for i ");
scanf("%d", &i);
printf("i is %d\n", i);
return 0;
}
Wie funktioniert das scanf()
Funktion eigentlich arbeiten, wenn ich Leerzeichen einfügen, nach der format-specifier wie scanf("%d ", &j);
?
Vielleicht sollten wir uns umbenennen der Titel um mehr Allgemeine ?
können Sie vorschlagen?
Ich dachte zu entfernen "nachlaufenden"
können Sie vorschlagen?
Ich dachte zu entfernen "nachlaufenden"
InformationsquelleAutor Vikas Verma | 2013-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem Leerzeichen im scanf-format bewirkt, dass es explizit Lesen und ignorieren, wie viele whitespace-Zeichen, wie es ist. Also mit
scanf("%d ", ...
nach dem Lesen einer Reihe, wird es weiter zu Lesen, Zeichen, wobei alle Leerzeichen, bis es sieht, ein nicht-Leerzeichen in der Eingabe. Dass nicht-whitespace-Zeichen werden Links als nächste zu lesende Zeichen von einem input-Funktion.Mit dem code:
es wird gedruckt, die erste Zeile, und dann warten, bis Sie eine Zahl eingeben, und dann weiter auf etwas zu warten, nachdem die Anzahl. Also, wenn Sie nur geben Sie 5Enter, es erscheint zu hängen — Sie müssen geben Sie eine weitere Zeile mit einigen nicht-whitespace-Zeichen auf es, um fortzufahren. Wenn Sie dann geben Sie 6Enter, wird der Wert für
i
, so wird Ihr Bildschirm etwa so Aussehen:Auch, da die meisten scanf %-Konvertierungen auch überspringen führende whitespace-Zeichen (alle außer
%c
,%[
und%n
), Räume vor %-Konvertierungen sind irrelevant ("%d"
und" %d"
handeln identisch). So zum größten Teil, sollten Sie vermeiden Sie Leerzeichen im scanf Umwandlungen, es sei denn, Sie wissen, die Sie speziell benötigen Sie für Ihre eigenartigen Effekt.InformationsquelleAutor Chris Dodd
Einer white-space-Zeichen (Leerzeichen, Zeilenvorschub, horizontaler und vertikaler Tabulator) in einem format-string steht für eine beliebige Anzahl von white-space-Zeichen in der Eingabe.
In Ihrem ersten Fall
wenn es auf die white-space char (WSC)
' '
dann wird es Essen alle Leerzeichen der Eingabe durch Benutzer einschließlich\n
auf die Taste Enter und es wird erwarten, geben Sie ein nicht-Windows-Skriptkomponente . In diesem Fall wird Ihr Programm beenden durch drücken von Strg + Z.Nicht sicher, aber für MS-WIN-Situation:
Ctrl + D
InformationsquelleAutor haccks
Einem whitespace-Zeichen in Ihrem
scanf
- format steht für eine beliebige Anzahl von whitespace-Zeichen, wie beschrieben, durchisspace
. Also, wenn Sie haben tailing Leerzeichen, Zeilenumbrüche, Tabulatoren oder sonstige whitespace-Zeichen, dann wird es auch konsumiert werden, indemscanf
bevor er zurückkehrt.scanf()
wird nicht zurückkehren, bis Sie etwas, das keine Leerzeichen eingegeben wird. Das wiederum bedeutet, dass Sie haben, zu erraten, was das Programm als Nächstes Fragen, und geben Sie den nächsten Wert vor der aktuellen Eingabe abgeschlossen ist. (Wenn Sie nicht tragen Sie den nächsten Wert, dann haben Sie mehr Probleme; das fünfte Zeichen (und der Zeilenumbruch, muss Folgen, bevor das terminal sendet das Zeichen-Programm) interpretiert werden, das nächste Feld. Leerzeichen in interaktive Formate sind schrecklich!InformationsquelleAutor Sergey L.
Den Unterschied (obwohl offensichtlich) ist ein anderes format-string. Wenn Sie die folgende Zeile eingeben:
"3 "
scanf()
wird erfolgreich zurück. Ansonsten hängt es davon ab, Ihren input zur Verfügung gestellt.scanf()
im wesentlichen überspringt Leerzeichen (tabs, Leerzeichen, Zeilenumbrüche), und sucht für alphanumerische Werte in der input-stream. Da das Leerzeichen, es wird in einen Topf geworfen mit der nachgestellte newline-Zeichen am Ende der Eingabe, wenn Sie die Taste ENTER, so ist es von wenig Konsequenz.scanf()
erwartet, dass der Eingang zu genau dem format-string, den Sie bieten, mit der Ausnahme, dass zusammenhängende Leerzeichen komprimiert werden zu einem einzigen whitespace-Zeichen. Dies wird sehr wichtig, wenn Sie wollen, um zu analysieren, große Zeichenfolgen von Daten mit string-Verarbeitung entspricht,sscanf()
.Eine gute übung, um weiter zu testen wäre das etwas wie:
Danach schauen und sehen, was die Werte dieser Ganzzahlen sind nach der Bereitstellung richtig und falsch formatiert, tröstete input (sprich: Leerzeichen und Bindestriche). Hier sind ein paar Beispiel läuft. Die erste verwendet falsche Eingaben, die zweite korrekt formatierte Eingabe. Beachten Sie, dass im ersten Fall
C
gar nicht fertig, alsscanf()
werden unerwartete Verhalten aus, wenn die Eingangs-und die format-strings nicht übereinstimmen. In der Regel sind Sie besser dran mit so etwas wiefgets()
um einen string der Eingabe durch den Benutzer, und verwenden Sie dann verschiedene such-Funktionen (sprich: strstr(), strch(), strcat, strcpy etc.) zu analysieren, Ihre Schnur, da es viel sicherer ist als nur mitscanf()
und vorausgesetzt, dass der Benutzer nicht einen Fehler machen, entweder versehentlich oder absichtlich.Nun, sollten Sie einen letzten Lauf: Du wirst sehen, dass
scanf()
komprimiert mehrere aufeinanderfolgende whitespace-Zeichen zu einem einzigen Zeichen, also warum diese Letzte läuft tatsächlich gelingt:Es nicht fassen, wie gut erkennbar die whitespace-Zeichen sind alle in einen Topf geworfen, in einen einzigen, und wie das Leerzeichen in diesem Beispiel ist von geringer Bedeutung. Es beschreibt auch, wie der format-string wird im wesentlichen reduziert auf ein Muster erwartet, Leerzeichen und nicht-Leerzeichen, und wie die Zuordnung der Werte auftreten können, um einige oder alle target-Variablen je nachdem, Wann der Eingang weicht von der Vorlage. Ich glaube nicht, dass dies gerechtfertigt war.
Sollte der code aufnehmen und Bericht der Rückgabewert von
scanf()
. Das würde zeigen, wie viele Werte festgelegt wurden. Die nachgestellten Leerzeichen im format-string ist nicht "wenig consquence" mit interaktiven Eingabe. Es bedeutet, dass der Benutzer eingeben muss, ein anderes Zeichen als Leerzeichen (und newline ist ein Leerzeichen), bevor die Eingabe vollständig ist.einer der Leerzeichen vor den Bindestrich im format bedeutend ist; die andere nicht. Wenn es keine Leerzeichen vor dem Bindestrich (z.B.
"%d%d-%d"
), dann einen input, wie23 34 - 45
fehl, weil der Platz in der Eingabe entspricht nicht den Strich in das format (aber"%d%d -%d"
wäre in Ordnung). Ihr Hauptaugenmerk ist richtig; die meisten Räume sind immaterielle, die in einemscanf()
format-string, aber nicht alle Räume von untergeordneter Bedeutung sind — und es ist die Subtilität, die sind und die sind gar nicht bedevils die Verwendung vonscanf()
et al. Und nachfolgende Leerzeichen in format-strings sind besonders tückisch!InformationsquelleAutor DevNull