2014-08-28 3 views
0

그래서 나는 몇 가지 testes했습니다 그리고 나는 사용자 입력이 Y/y 경우 다음 코드와 함께 그 루프 (나는 getchar()C getchar() 이상한 동작

#include <stdio.h> 
#include <stdbool.h> 

int main(int argc, char* argv[]) { 
    for(int i = 0; i < argc; i++) 
     printf("argv[%d] = %s\n", i, argv[i]); 
    char name[20]; 
    printf("What's your name ? "); 
    gets(name); 
    char lastname[20]; 
    printf("%s what's your last name ? ", name); 
    fgets(lastname, 20, stdin); 
    int age; 
    printf("%s %s what's your age? ", name, lastname); 
    scanf("%d", &age); 
    bool exit = false; 
    char c; 
    while (!exit) { 
     printf("Do you wish to exit the program ? (Y/N) "); 
     c = getchar(); 
     getchar(); 
     if (c == 'Y' || c == 'y') 
      exit = true; 
    } 
    printf("Have a nice day %s %s.\n", name, lastname); 
    return 0; 
} 

사람이 문제가 무엇인지 가르치 려 수 있습니다 : 그것은 사용자의 다음 입력)에 대한 준비가 될 것입니다, 그래서 다시 대기열에 \ n을 없애?

+0

모든 경고와 디버그 정보 (예 :'gcc -Wall -g')로 컴파일하십시오. 그런 다음 디버거를 사용하십시오 (예 :'gdb') –

+0

Y 다음에 Enter 키를 누르는 것을 잊었습니까? – Sayutee

+0

읽는 모든 * char *를 검사하고 각각을 처리해야하며, 특정 호출에서 개행을받는 것으로 가정하지 마십시오. – hyde

답변

0

루프를 입력 할 때 이미 입력 스트림에 개행 문자가 있습니다. 이로 인해 첫 번째 getchar\n을 반환합니다. 두 번째 getcharY입니다. 이 문제를 해결하려면 루프를 시작하기 전에 getchar 호출이 필요합니다.

+0

getchar 함수에 대해 배웠을 때 큐의 내부에 입력을 유지한다고 들었습니다. 그래서이 큐가 getchar 함수에 독점적이지는 않지만 모든 입력 함수에 적용된다는 의미입니까? 또한, \ n 문자는 어디에서 왔습니까? 나는 그것이 scanf였던 마지막 입력 함수에서 왔다고 추측 할 것이다.하지만 그것이 반환하는 \ n 문자를 잘라내는 것만 큼, 아마도 그것을 반환하지 않고 대기열에 남아있을 것인가? 이 문제를 설명해 주시면 고맙겠습니다. – AALC

+0

'scanf'와'getchar' 함수 군을 가진 모든 입력은'stdin' 스트림으로부터옵니다, 그렇습니다, 그들은 모두 같은 입력 대기열을 공유합니다. 여기서'% d '를 입력 형식으로 지정했기 때문에'scanf'가 줄에 개행 문자를 남기는 것이 문제입니다. '% d \ n'을 지정했다면,'scanf'가 개행을 삼킨 것입니다. 그렇게하면 문제를 그 방법으로 해결할 수 있습니다. 또는 루프 앞에 'getchar' 호출을 추가하는 것만으로도 문제를 해결할 수 있습니다. –

+0

좋아, 지금은 더 잘 이해한다고 생각해. 마지막 질문에서 % d 대신 % d \ n을 지정하면 \ n 문자가 대기열에서 튀어 나오지 않는다고 말하면됩니다. 왜 그런가요? – AALC