2017-12-14 8 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"、 "y"、 "N"または "n"(はいまたはいいえ)を入力するまで待ちます。 ユーザーがはい(「Y」、」Y」)、それは 次のメッセージ表示プログラム終了します返信した場合:機能取得ごみ値

連絡先管理システム:あれば、そうでない場合<(改行が続く) を終了ユーザーがNo( "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'であるとします。その後、が真であるため、ループを続行します。

ここには修正されたループがあります。

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になりたい何

Try it online!


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

Yの1、yN、およびnです。それらのものでなければ、ループに入ります。また、bが改行でない場合は、ループを入力します。

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

bが改行でない場合は、可能性の高い行が長すぎたので、私たちはラインを排出しなければなりません。まず、bの値を入力ストリームに戻します。次に、scanfに改行文字まですべてをスキャンしてからそれを消費させます(bに)。ループが終了します値を入力、事前移入abを取得するための次のscanfの呼び出しに備えて

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

。これは、場合によってはscanfジャム(EOFまたは何らかのファイル入力エラーで)です。

残りのコードは、あなたが持っていた通りです。

+0

ご協力いただきありがとうございます。それは働いているが、私はコードを理解していない –

2

&&||の使用を再考し、かっこを使用する必要があると思います。このコードは、EOFとタイプされている単語(「はい」など)も処理します。

#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' 'の代わりに' '\ n''と '' getchar'ループの '' EOF'と比較するつもりだと思う。 – interjay

+0

また、空行で間違った結果が出ると思います( 'a'は' \ n'、文字は 'b'を読むと失われます)。 – interjay

+0

内部 'while'ループは間違いなく間違いでした。 「空行」状態はより面白いです。あなたは正しく動作していませんが、 'scanf()'は空行の終わりをマークする改行の後に何番目の文字が入力されるまで戻りません。その2番目の文字が別の改行であった場合、 'gobble'ループは悪い考えですが、他の文字があれば、それは 'b'になります。 2行目の終わり。したがって、 'gobble'ループに入る前の 'b'の条件。ありがとう! –

関連する問題