2012-03-05 2 views
0

C, unix 및 i로 응용 프로그램을 작성하는 기능은 입력이 유효 할 때까지 사용자 입력을 요청합니다. - 시간루프가 C에서 예상보다 많이 실행됩니다.

int inputX() 
{ 
    int result; 
    char input; 
    while(1) 
    { 
     printf("Input x (a, b, c, d, e, f, g, h) :"); 
     scanf("%c", &input); 
     result = validChar(input); 
     if (result >= 0) 
     { 
      return result; 
     } 
     else 
     { 
      printf("Invlid input. Lets try again.\n"); 
     } 
    } 
} 

validChar() 검사를 입력이 인 경우 : 바로 갈 수 있습니다. 입력하면 모든 것이 정상입니다. 예를 들어. 1 출력

Input x (a, b, c, d, e, f, g, h) :1 
Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) :Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) : 

심지어 시도 슬립()이지만 didnt 한 작업 .. C가 까다 롭다 : |

+1

이 질문에 'C++'태그가 붙은 이유는 무엇입니까? –

+1

입력 버퍼에 일부 데이터가 남아있는 것 같습니다. 두 번째 반복에서'input'의 내용을 검사 했습니까? 그것은 당신에게 많은 것을 말할 것입니다 ... –

+1

[C loop prints strings twice? (scanf ("% c")를 사용하여)] (http://stackoverflow.com/questions/9421926/c-loop-prints-string-twice-using-scanfc) –

답변

4

사용이 싼 트릭은 버퍼에 남은 공백을 없애 :

scanf(" %c", &input); 
    ^
+0

매력처럼 작동합니다! 아무도 나 한테 말하지 않으면 얼마나 추워? 고마워요 :) – Wish

+0

그래, 이건 내가 원했던 것들 중 하나이다. '% d','% i','% o','% x','% s','% f' 등의 다른 변환 지정자의 대부분 (모든?)과 달리,'% c' 변환 지정자는 선행 공백을 건너 뛰도록'scanf '에 지시하지 않습니다. 때로는 공백 문자를 읽길 원하기 때문에 완벽하게 논리적이지만 논쟁 한 것과 같은 문제가 발생할 수 있습니다. 위의 트릭을'% c' 전에 공백과 함께 사용해야 동일한 효과를 얻을 수 있습니다. –

0

%cscanf 그것이 모든 문자를 먹을 것 사용. 두 번째 실행은 아마도 입력 한 개행입니다.

0

첫 번째 호출은 1입니다. 두 번째 전화는 \n입니다. 전체 줄을 읽고 그 뒤를 파싱합니다.

관련 문제