2017-02-23 4 views
14

Ich versuche, diesen Codeblock auszuführen.Warum wird nicht die zweite scanf() ausführen

#include <stdio.h> 
int main(void) 
{  

    printf("Start from here\n"); 
    int e, f, g, h; 

    scanf("%d,%d", &e, &f); 
    scanf("%d, %d", &g, &h); 

    printf("%d %d %d %d", e, f, g, h); 
} 

Wenn ich Eingang 2,0 oder etwas, das die Format-String in der ersten scanf() übereinstimmt, auch die zweite scanf() ausführt.

Allerdings, wenn ich Eingang etwas wie 2-0 im ersten scanf(), das Programm die zweite scanf() überspringt und geht direkt zu dem printf()

Zum Beispiel ist hier der Eingang und der Ausgang eines Probelauf des Programms. Die zweite Zeile ist die Eingabe.

Start from here 
1-2 
1 0 -2 -856016624u 

Beachten Sie, wie das Programm übersprungen vollständig den zweiten scanf(), und ging direkt in die printf(). Warum wird der zweite scanf() hier übersprungen?

+1

'1-2' sollte' 1, -2' sein? Das ist ein Komma zwischen den Zahlen. Denn das hast du 'scanf' gesagt. – kaylum

+3

Ihre zweite 'scanf' wird ausgeführt.'e' wird' 1' und 'g' wird' -2' –

+1

Warum überprüfen Sie nicht die Rückgabewerte von 'scanf'? Es könnte praktisch sein, die Handbuchseite –

Antwort

1

in Ihrem Code ist scanf("%d, %d",&e,&f) auf diese Weise, so sollten Sie Ihre Eingaben wie geben: 1,2 oder 2,3 etc

Wenn Sie Ihre Eingabe wie 0-2 oder 2-4 gegeben werden soll, dann muss Ihr Scanf so sein : scanf("%d-%d",&e,&f).

Auf diese Weise wird es nicht übersprungen.

21

scanf 's format string kümmert sich auch um die Nichtformatbezeichner. Wenn Sie "1-2" schreiben, liest der erste scan "1", dann suchen Sie nach einem Komma. Es wird keinen finden, also wird es aufgeben. Nun wird der zweite Scanf "-2" sehen und dann nach einem Komma suchen. Es wird keinen finden, also wird es aufgeben.

Das Endergebnis ist, dass die anderen beiden Variablen nicht gesetzt werden, so dass sie zum Zeitpunkt der Ausführung, was Müll ist in ihrem Speicherort ist.

Sie können dies vermeiden, indem Sie den Rückgabewert von scanf überprüfen. Es wird Ihnen sagen, wie viele Werte es gefunden hat. Versuchen Sie folgendes:

#include <stdio.h> 
int main(void) 
{  

    printf("Start from here\n"); 
    int e, f, g, h; 

    if (scanf("%d,%d", &e, &f) != 2) { /* error handling */ } 
    if (scanf("%d, %d", &g, &h) != 2) { /* error handling */ } 

    printf("%d %d %d %d", e, f, g, h); 
} 
+5

Hinweis: Im Rahmen der * Fehlerbehandlung * müssen Sie möglicherweise einige Benutzereingaben verwerfen! Dies kann mit einer 'getchar'-Schleife oder mit' scanf ("% * [^ \ n]") geschehen; getchar(); 'zum Beispiel ... – Sebivor

+5

Beachten Sie auch: der Raum ist in diesem Fall semantisch bedeutungslos; Beide Formatzeichenfolgen sind funktional äquivalent, da '% d 'sowieso führende Whitespaces * implizit verwirft *. – Sebivor

+0

Gut zu wissen, entfernt das Bit über die Formatzeichenfolgen. –

2

Entfernen eines Komma zwischen den beiden Formatbezeichner.

scanf("%d %d", &e, &f); // Remove comma in first argument of scanf 
scanf("%d %d", &g, &h); // Remove comma in first argument of scanf 
     ^^^ 
     Remove comma between two numbers 

Da scanf wird überspringen nur Leerraum und die comma ist nicht Leerraum.

Was passiert, wenn Sie scanf bitten, numerische Daten zu lesen, ist, dass es zuerst jeden gefundenen Leerraum überspringt und dann Zeichen liest, bis das gelesene Zeichen nicht Teil einer Zahl sein kann.

In diesem Fall, wenn es das Komma trifft, hört es auf zu lesen. Da es keine Ziffern gelesen hat, gibt es keine Nummer zum Speichern, so dass es einfach den ursprünglichen Wert belässt.

Verwandte Themen