2017-12-14 3 views
-1
#include <stdio.h> 
    void clearKeyboard(void) 
    { 
     while (getchar() != '\n') ; // empty execution code block on purpose 
    } 
    int yes(void) 
    { 

     char a,b; 
     printf("<Please enter a character>: "); 
     scanf("%c%c", &a,&b); 

     while ((a !='Y' && a !='y' && a !='N' && a!='n') || (b!='\n')) 
     { 
      if (b!='\n') ungetc(b, stdin),scanf("%*[^\n]%c", &b); 
      a='n',b='\n'; 
      clearKeyboard(); 
      printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: "); 
      scanf("%c%c", &a,&b); 

     } 
     if (a =='Y' || a=='y') 
     { 
      printf("Contact Management System: terminated\n"); 
      return 1; 

     } 
     else 
     { 
      if (a =='N' || a=='n') 
      ContactManagerSystem(); 
      return 0; 
     } 

    } 

    int menu(void) 

    { 
     int i; 
     printf("0. Exit\n\nSelect an option:> "); 
     scanf("%d", &i); 
     while (i<0 || i>6) 
     { 
      printf("*** OUT OF RANGE *** <Enter a number between 0 and 6>: "); 
      scanf("%d", &i); 
     } 
     return i; 
    } 

    void ContactManagerSystem(void) 

    { 
    int i=menu(); 

     switch(i) 
     { 
     case 0 : 
      printf("Exit the program? (Y)es/(N)o: "); 
      yes(); 


     } 

    } 
    int main(void) 
    { 
     ContactManagerSystem(); 
    } 







So my "yes" function is working fine on it's own but when I call it within 

ContactManagerSystem()의 경우 그것은 어떤 이유로 "예"기능에 미친거야 0 실제로 내가 같이 "아니오" "예"또는 입력하도록 필요 유효성 검사 함수이다 ' Y'''N '또는'n ' 사용자가 "Y", "y", "N"또는 "n"을 입력 할 때까지 기다리십시오 (예 또는 아니오). 사용자가 예를 대답하는 경우 ("Y"는, "Y")는 다음과 같은 메시지가 표시하는 프로그램이 종료됩니다 :기능 점점 쓰레기 값

연락처 관리 시스템은 다음 경우, 그렇지 않은 경우 (줄 바꿈 다음) < 을 종료 사용자가 아니오 ("N", "n")를 입력하면 응용 프로그램은 계속 메뉴를 표시합니다.

+0

괄호를 사용하십시오. 'a'가''y'' (그리고 리턴 키가 뒤따라야 함)로 설정되면''Y'' 또는''n''' 또는''N'''과 같지 않기 때문에'|| '조건은 참으로 평가됩니다. 실제로'yes'라고 타이핑하면 다른 문제가 생깁니다. 그리고 EOF가 비난받을만한 행동으로 이어지는 것을 나타냅니다. –

+0

'a! = X || a! = Y' (그리고'X! = Y')는 항상 참입니다. –

+0

'clearKeyboard'가 필요 없습니다. – jxh

답변

0

시도 :

while ( (!(a =='Y' || a =='y') && !(a =='N' || a =='n'))  ||  ( b !='\n')) 
+0

매우 복잡한 조건 인 것 같습니다. 또한, 질문은''n ''이 아닌 개행''\ n ''에 대해'b'를 테스트합니다. –

1

당신의 while 루프의 감각은 잘못된 것입니다. a'y'이라는 문자가 있다고 가정합니다. 그런 다음 'y' != 'Y'이 참이므로 루프를 계속합니다.

다음은 수정 된 루프입니다.

while ((a !='Y' && a !='y' && a !='N' && a!='n') || (b!='\n')) 
    { 
     if (b!='\n') ungetc(b, stdin),scanf("%*[^\n]%c", &b); 
     a='n',b='\n'; 
     printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: "); 
     scanf("%c%c", &a,&b); 
    } 

새 코드는 줄이 너무 길어서 원래 코드에서 누락 된 줄을 표시합니다. 우리가 할 a를 원하는 것은


while ((a !='Y' && a !='y' && a !='N' && a!='n') || (b!='\n')) 

Try it online!Y 중 하나 y, Nn입니다. 그런 것이 아닌 경우 루프를 입력하십시오. b이 개행이 아닌 경우 루프를 입력하십시오. b 만약

if (b!='\n') ungetc(b, stdin),scanf("%*[^\n]%c", &b); 

는 가능성이 라인이 너무 오래했다, 줄 바꿈없는, 그래서 우리는 선을 소모해야합니다. 먼저 b의 값을 입력 스트림에 다시 넣습니다. 그런 다음 scanf에게 줄 바꿈 문자까지 모든 항목을 스캔 한 다음 소모하십시오 (b). 다음 scanf 호출에 대비하여

a='n',b='\n'; 

는 입력을받을 루프가 종료하게됩니다 값으로 ab을 미리 채 웁니다. 이 경우 scanf 잼 (예 : EOF 또는 일부 파일 입력 오류)입니다.

나머지 코드는 이전과 동일합니다.

+0

도움을 주셔서 대단히 감사드립니다. 그것은 작동하지만 코드를 이해하지 못합니다 –

2

&&||을 다시 생각하고 괄호를 사용해야합니다. 이 코드는 또한 EOF와 단어 (예 : "yes"와 같은)를 처리합니다.

#include <stdio.h> 

int main(void) 
{ 
    char a, b; 
    printf("<Please enter a character>: "); 
    if (scanf("%c%c", &a, &b) == 2) 
    { 
     while ((a != 'Y' && a != 'y' && a != 'N' && a != 'n') || b != '\n') 
     { 
      printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: "); 
      if (b != '\n') 
      { 
       int c; 
       while ((c = getchar()) != EOF && c != '\n') 
        ; 
      } 
      if (scanf("%c%c", &a, &b) != 2) 
       break; 
     } 
     if (a == 'Y' || a == 'y') 
     { 
      printf("Got yes!\n"); 
      return 1; 
     } 
     else if (a == 'N' || a == 'n') 
     { 
      printf("Got no!\n"); 
      return 0; 
     } 
    } 
    printf("Got EOF\n"); 
    return 0; 
} 

a의 편지도 'Y''y''N''n' 경우 또는 b의 값은 개행, 문제보고, 줄 바꿈까지 어떤 길잃은 문자를 중얼 (또는 EOF)이 아니며, 경우 다시 시작하십시오. 인쇄 및 종료 상태를보고합니다.

예 실행 :

$ ./scan13; echo $? 
<Please enter a character>: yes 
*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: no 
*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: pdq 
*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: y 
Got yes! 
1 
$ scan13; echo $? 
<Please enter a character>: n 
Got no! 
0 
$ ./scan13; echo $? 
<Please enter a character>: Got EOF 
0 
$ 

아래 코멘트에, scanf()의 문제점 중 하나가 의도 한대로 오류에 대한 행동이 있는지 확인하고있다 언급 한 바와 같이. fgets() 또는 POSIX getline()을 사용하여 전체 라인을 버퍼로 읽은 다음 데이터를 sscanf()으로 구문 분석하는 것이 더 쉽습니다.

+0

' '\ n' '대신'getchar' 루프에서''\ n'''과'EOF'와 비교할 생각입니다. – interjay

+0

또한, 빈 줄은 잘못된 결과를 줄 것이라고 생각합니다. ('a '는'\ n'이고 문자는'b'를 읽지 못할 것입니다.) – interjay

+0

내부 while 루프는 확실히 실수였습니다. '빈 줄'상태가 더 재미 있습니다. 당신은 그 행동이 좋지 않다는 것이 맞지만,'scanf()'는 빈 라인의 끝을 표시 한 개행 문자 뒤에 몇 번째 문자가 입력 될 때까지 리턴하지 않을 것입니다. 두 번째 문자가 또 다른 개행 문자 인 경우 'gobble'루프는 좋지 않은 생각이지만 다른 문자가 있으면 'b'에 있고 다른 문자는 한 개 이상 있어야합니다. 두 번째 줄 끝. 따라서 'gobble'루프에 들어가기 전에 'b'조건. 감사! –