2016-06-20 1 views
0

/프로그램은 두 개의 정수를 추가하고 입력이 정수 인쇄 잘못된 출력이 항목의 수를 반환/첫 번째 문자를 알파벳으로 입력 할 때 두 번째 숫자 (num2)를 입력 할 수없는 이유는 무엇입니까?

#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'는 컴파일되지 않습니다.) 또한 들여 쓰기가 끔찍한데 (Glibc 프로그래머가 아닌 한)'flag'는 변수. –

+2

"처음으로 알파벳 하나를 입력 할 때?"-> 사용 된 입력 게시 – chux

+1

"처음으로 알파벳을 알파벳으로 입력하면 왜 두 번째 숫자 (num2)를 입력 할 수 없습니까?" "scanf ("% d % c ", & num1, & chek)'는 항상 첫 번째 입력을 정수로 파싱 할 것으로 기대하고 필요합니다. 입력에없는 경우에는 소비되지 않고 두 번째'scanf '는 같은 방법으로 같은 입력을하고 다시 실패하십시오. – kaylum

답변

0

scanf 기능이없는 경우 읽거나 쉽게 말해, 당신의 형식 문자열에 할당 된 항목이 없습니다.

문자를 입력하면 첫 번째 scanf는 숫자와 일치 할 것으로 예상하고 if 문이 즉시 실행되기 때문에 0을 반환합니다. 다음 scanf에 도달하면 초기 문자가 첫 번째 scanf와 일치하지 않으므로 stdin에 여전히 데이터가 있으므로 두 번째도 0을 반환하도록 만듭니다. 따라서 첫 번째 입력 후에 메시지가 인쇄됩니다.

첫 번째가 유효하지 않은 경우에도 항상 두 번째 숫자를 입력하려면 두 번째 스카프에서 차단하여 새 데이터를 입력 할 수 있도록 표준 버퍼를 지워야합니다. fflush라는 함수가 있는데이 함수는 fflush(stdin)처럼 호출 할 수 있습니다.하지만이 함수의 동작은 정의되지 않았으므로 그 함수에 의존해서는 안됩니다.

약간의 해킹으로 코드를 게시하여 프로그램이 예상대로 작동하도록 할 것입니다.

#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; 
} 

내가 한 것은 새로운 라인이나 파일 끝을 찾을 때까지 모든 것을 표준 입력에서 읽으려고 시도하는 것입니다. 이렇게하면 버퍼가 비어 있고 다음 scanf가 마지막 입력의 나머지 데이터와 일치하지 않게됩니다.

관련 문제