2013-03-05 2 views
2

정수로 입력하는 방어 프로그래밍을 시도했지만 문자를 입력하면 프로그램이 무한 루프가됩니다. 그런 다음 문자로 입력되도록 전환했지만 루프를 두 번 수행합니다. 한 번 잘못된 문자와 한 번 줄 끝 키 입력에 대한.메뉴에 방어적인 프로그래밍. 어떤 유형의 입력을 받아야합니까?

루프를 만들 수있는 방법이 있습니까?

코드 :

int main(int argc, char *argv[]) 
{ 
    char choice='5'; 
    while (choice != '1' && choice !='2' && choice !='3' && choice!='4' && choice!='0') 
     { 
      printf("Parakalw epilekste ena apo ta parakatw\n\n"); 
      printf("1.\tKafe 1.5 euro\n"); 
      printf("2.\tKafe me gala 1.8 euro\n"); 
      printf("3.\tSokolata 2.1euro\n"); 
      printf("4.\tSokolata me gala 2.4 euro\n"); 
      printf("0.\tExodos\n\n"); 
      printf("parakalw eisagete thn epilogh sas: "); 
      scanf("%c",&choice); 
     } 
system("PAUSE");  
return 0; 
} 
+0

왜 int가 아닐까요? int n; scanf ("% d", &n);'? – Mikhail

+0

n = 숫자가 아닌 임의의 문자 인 경우 – n17n

+0

@NikolaosTsouktakos : scanf가 숫자를 읽지 못하고 루프가 쓰여지는 방식이기 때문에 무한 루프가됩니다. 계속해서 동일한 입력을 사용하여 계속 노력하십시오. – teppic

답변

2

사용 scanf(" %c", &choice) 그렇지 않으면 당신의 라인 피드는 문자를 따기 후 표준 입력에 남아, 그것은 다음 scanf와 통화에서 읽을 수 있습니다, 그것은 공백을 건너 있도록. 지정자 앞의 공백은 공백 문자 (공백, 탭 및 리턴)의 종류와 일치한다는 것을 의미합니다.

+0

"방어 프로그래밍"이 중요합니까? 더 자세히 살펴 보거나 이동해야합니까? – n17n

+0

사용자가 유효한 값을 입력했는지 확인하는 것이 좋습니다. switch 문이있는 루프를 사용하여 입력 메시지를 처리하고 오류 메시지를 인쇄하는 기본 대/소문자를 사용하십시오. – teppic

2

방어 프로그래밍 (정확하게 당신이 정확히 무엇을 의미하는지)에 대해서는 scanf을 전혀 사용하지 않았기 때문에 실수로 쉽게 실수를 할 수 있습니다.

대신 입력란을 fgets으로 읽고 필요에 따라 구문 분석 한 다음 트리밍, 사용자 정의 구문 분석 코드 또는 sscanf을 사용하십시오.

또한 *scanf 함수의 반환 값을 항상 확인하는 것이 좋습니다. 실제 오류와 실제로 스캔 한 항목 수를 확인하십시오.

관련 문제