2016-06-07 3 views
0

나는 몇 가지 이유 때문에 첫 번째 입력 확인이 잘 작동하는 간단한 바이너리 계산기를 작성하려고합니다. 숫자에 대한 두 번째 확인이 거의 같은 방식으로 작성되었지만, 사용자가 잘못된 입력을 입력하면 while 루프는 새로운 사용자 입력을 기다리지 않고 무한 루프를 반복합니다. 여기에 코드가 있으며 도움을 주셔서 감사합니다.C에서 입력 확인

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 
    char operator[20]; 
    char valid_operator[4] = "+-*/"; 
    printf("Enter operator: "); 
    scanf("%s", operator); 
    printf("You entered: %s\n", operator); 
    while(strchr(valid_operator, (int)operator[0]) == NULL) { 
    printf("%s is not a valid operator. Enter +, -, /, or *: ", operator); 
    scanf("%s", operator); 
    } 

코드는 여기까지입니다. 사용자가 잘못된 입력을 처음 입력하면이 다음 부분은 무한 루프로 던져집니다. 다시 묻는 것은 결코 일어나지 않습니다.

int input1; 
    int input2; 
    printf("Enter the two inputs (separated by whitespace): "); 
    int num_ints = 1; 
    num_ints = scanf("%d %d", &input1, &input2); 
    printf("Input 1: %d. Input 2: %d.\n", input1, input2); 
    while(num_ints < 2){ 
    printf("Invalid input. Enter two integers separated by whitespace: "); 
    num_ints = 0; 
    num_ints = scanf("%d %d", &input1, &input2); 
    printf("Input 1: %d. Input 2: %d.\n", input1, input2); 
    } 
    return 0; 
+0

나는 줄 바꿈 ... –

+2

사용는 fgets는 (... valid_operator)', 작동하지 않습니다, 키보드에서 읽은 문자열 –

+1

'strchr과에서 추출 sscanf를를 사용하는에 대해 그 정의가 없기 때문에 그것은'\ 내기 문자열 조작에 필수적인 '0'터미네이터입니다. 'char valid_operator [] = "+ - * /";'크기를'4 '로 제한 했으므로 배열에 터미네이터가 없습니다. –

답변

0

표준 입력을 삭제해야합니다. 예제에서 "1 t"가 아닌 정수를 입력하면 "t"는 소비되지 않습니다 (스트림에 남음). 루프이 추가 :

while(num_ints < 2){ 
    while (fgetc(stdin) != '\n'); // clear input 
. . . 

문제의 좋은 설명은 C program loops infinitely after scanf gets unexpected data를 참조하십시오.

+0

아 이런 일이 벌어지고있는 것 같아. 이렇게하면 문제가 해결됩니다. 여전히 잘못된 입력이 첫 번째 경우에는 소비되지만 두 번째 경우에는 그렇지 않은 이유를 이해하지 못합니다. –

1

어느 새 사용자 입력을 기다리지 않고 무한 루프 그 이유는 scanf는 (귀하의 경우 %d)이 요구 된 형식의 문자 를 읽을 실패한 경우는 파일 포인터와시를 진행되지 것입니다 루프의 다음 반복은 동일한 잘못된 문자를 다시 읽으려고 시도합니다.

이 POSIX와 일치 : 비교 그들이 동등하지 않은 것을 알 수 http://pubs.opengroup.org/onlinepubs/009695399/functions/fscanf.html

경우, 지시어가 실패 할 것이요, 다른 이후 바이트 읽지을 유지하여야한다. 의 경우에 제로를 제공하거나 심지어 미만이어야 할

는 ... 성공적 일치하고 할당 된 입력 항목의 수를 반환 : 또한

상기 man scanf로부터 반환 값 조기 대응 실패.

따라서 fgetssscanf을 더 잘 결합하십시오.

do { 
    char buf[BUFSZ]; 
    printf("Enter the two inputs (separated by whitespace): "); 
    if(fgets(buf, BUFSZ, stdin) == NULL) 
    { 
     /* Error exit. */ 
     break; 
    } 
    num_ints = sscanf(buf, "%d %d", &input1, &input2); 
} while(num_ints != 2); 
+1

'fgets'의 결과도 +1해야합니다. –

+0

감사합니다. – fukanchik