2016-06-20 3 views
0

/Programm zwei Zahlen zu addieren und wenn Eingabe nicht integer Druck ungültig Ausgabe/Warum kann ich keine zweite Nummer (num2) eingeben, wenn ich zuerst eine als Alphabet eingib?

#include <stdio.h> 

int main() 
{ 
int num1,num2,flag=0,sum; 
char chek,chek2; 

/* To check input value a integer or not*/ 

if(scanf("%d%c", &num1, &chek);!= 2 || chek != '\n') 
    { 
     flag=flag+1; 

    } 
if(scanf("%d%c", &num2, &chek2) != 2 || chek2 != '\n') 
    { 
     flag=flag+1; 

    } 
if(flag!=0) 
    printf("invalid input\n"); 
else 
{ 
    sum=num1+num2; 
    printf("the sum is:%d",sum); 
} 
return 0; 
} 
+4

'scanf ("% d% c ", & num1, &chek);! = 2' wird nicht kompiliert. Auch Ihre Einrückungen sind hässlich (es sei denn Sie sind ein Glibc Programmierer), und' flag' ist ein schlechter Name für eine Variable –

+2

"wenn ich zuerst als Alphabet eingabe?" -> poste deine Eingabe benutzt – chux

+1

"Warum kann ich keine zweite Nummer (num2) eingeben, wenn ich zuerst eine als Alphabet eingabe?" 'scanf ("% d % c ", & num1, & chek)' erwartet immer (und benötigt), dass die erste Eingabe als Ganzzahl analysierbar ist. Wenn die Eingabe dies nicht hat, wird sie nicht konsumiert und die zweite 'scanf' wird dann versuchen, die zu analysieren gleiche Eingabe und erneut auf die gleiche Art. – kaylum

Antwort

0

scanf Funktion der Anzahl der Elemente lesen zurückzukehren, oder in einfachen Worten, die zu Ihrem Format-String zugewiesenen Elemente.

Wenn Sie ein Zeichen eingeben, gibt das erste scanf 0 zurück, weil erwartet wird, dass es mit einer Zahl übereinstimmt und dass if-Anweisung sofort ausgeführt wird. Wenn es den nächsten scanf trifft, gibt es noch Daten in der stdin, weil das erste Zeichen nicht vom ersten scanf abgeglichen wurde, so dass es auch den zweiten zurückgibt. Deshalb erhalten Sie die Nachricht nach der ersten Eingabe gedruckt.

Wenn Sie immer die zweite Nummer eingeben möchten, auch wenn die erste nicht gültig war, müssen Sie sicherstellen, dass Sie den Stdin-Puffer löschen, damit er im zweiten Schal blocken und auf neue Daten warten kann. Es gibt eine Funktion namens fflush, die man so nennen kann fflush(stdin) aber das Verhalten ist ziemlich undefiniert und man sollte sich nicht auf irgendetwas verlassen.

Ich werde Ihren Code mit einem kleinen Hack veröffentlichen, um das Programm mit dem erwarteten Verhalten arbeiten zu lassen.

#include <stdio.h> 

int main() { 

    int num1,num2,flag=0,sum; 
    char chek,chek2; 


    if(scanf("%d%c", &num1, &chek) != 2 || chek != '\n') 
    { 
     flag = flag + 1; 

     //Ugly hack to clear the stin buffer 
     char ch; 
     while ((ch = getchar()) != EOF && ch != '\n'); 

    } 

    if(scanf("%d%c", &num2, &chek2) != 2 || chek2 != '\n') 
    { 
     flag = flag + 1; 
    } 

    if(flag!=0) { 
     printf("invalid input\n"); 
    } else { 
     sum = num1 + num2; 
     printf("the sum is:%d\n", sum); 
    } 
    return 0; 
} 

Was ich getan habe, ist zu versuchen, alles aus dem stdin zu lesen, bis ich eine neue Zeile oder eine End-of-Datei. Auf diese Weise ist der Puffer leer und der nächste scanf wird nicht versuchen, irgendwelche verbleibenden Daten von Ihrer letzten Eingabe zu vergleichen.

Verwandte Themen