2009-12-24 7 views
2

숙제의 일부로 stdin에서 하나의 char을 읽고 그것에 따라 행동하려고합니다 :C - stdin에서 하나의 문자를 읽으려고 시도하는 중/scanf/getchar

char choice; 

while (1) { 
    printf("please enter [y]es, [n]o or [m]aybe: "); 
    scanf("%c", choice); 
    fflush(stdin); 
    // validate input 
    if (choice == 'y' || choice == 'n' || choice == 'm') { 
     break; 
    } else { 
     printf("Please enter only \'y\', \'n\' or \'m\'!\n"); 
    } 
} 
// do something with the input 
if (choice == 'y') { 
    printf("you selected yes!\n"); 
} 

어떤 이유에서든 scanf는 char 및 line-feed를 모두 캡처하므로 입력 내용을 처리하고 "y ','n '또는'm '만 입력하십시오. ! " 선. stdin에 여러 문자를 입력하면 모든 행에 대해 해당 행이 인쇄되고 첫 번째 문자에는 올바르게 수행됩니다. 따라서, 예를 들어 : 나는 getchar가를 사용하는 경우

$ ./run 
please enter [y]es, [n]o or [m]aybe: y<return> 
you selected yes! 
Please enter only 'y', 'n' or 'm'! 
$ ./run 
please enter [y]es, [n]o or [m]aybe: yes<return> 
you selected yes! 
Please enter only 'y', 'n' or 'm'! 
Please enter only 'y', 'n' or 'm'! 
Please enter only 'y', 'n' or 'm'! 
$ 

같은 일이 발생합니다. 내가 뭘 놓치고 있니? 감사. 제대로 작동하려면

답변

7

당신은 scanf("%c 사이의 공간이 필요합니다 :

scanf(" %c", &choice); 

을 그리고 당신은 또한 & 선택하지 선택을 사용할 필요가!

편집 : 당신이 그것에 인 동안, 당신이 그 루프 do while()로 볼 수도 있습니다 (교수 특별히 사용했다 않는 한 break) - 사용자 입력의 유효성을 검사 할 때 좋은 작품 do while!

+0

의 해결 방법은 좋은 일입니다, 감사합니다! – sa125

+0

예기치 않은 입력이있을 때까지; 예를 들어 "y x z"를 입력 해보십시오. 문제의 해결 방법 인 – Clifford

3

더 나은 fgetc()를 사용하십시오. scanf()는 항상 최후의 수단이어야합니다.

3

입력 스트림에 대해 fflush()가 ISO에서 정의되지 않았습니다. Microsoft의 C 런타임 라이브러리에 정의되어 있지만 이식 가능하지는 않습니다.

사용자가 예상 된 데이터를 입력 할 때 "공간 % c"솔루션이 작동하지만 여러 가지 방법으로 실패합니다. 예를 들어 "y n y n"을 입력 해보십시오. 콘솔 입력은 선형 지향입니다. 가장 좋은 건 당신이 때문에 전체 라인을 폐기하도록하는 것입니다 : 모든

scanf("%c", choice) ; 
while(choice != '\n' && getchar() != '\n') /* do nothing*/ ; 
0

우선 우리가 O의 수를 볼 수있는 경우 의견 제출 불충분 한 점의 brief.Because을 유지됩니다/P입니다 (1 + charcter의 no) 인쇄 할 수없는 문자 '\ n'을 입력 한 후에 엔터를 누르면 beacuse가됩니다. 문자열 뒤에 문자열이 추가됩니다. 때문에 나는 comment.This으로이를 게시 할 수 불충분 한 점에

$ ./run 
please enter [y]es, [n]o or [m]aybe: y<return> 
you selected yes! 
Please enter only 'y', 'n' or 'm'! -----------> it is due to reading of the '\n' by scanf 

편집을 할 위의 답변

+0

이 맞습니까? 질문에 대한 주석입니다 (답이 아님). – jogo

+0

내가 원했던 충분한 포인트를 갖고 싶지는 않았지만 나는 이것을 위해 donwnvoted 될 것을 몰랐다. – Kalu

+0

이 견해로 답을 편집하십시오. – jogo

관련 문제