0

課金システムのプログラムを書いています。プログラムで do-while ループを使用しています。そして、プログラムはユーザーの入力に従って実行されます。ユーザーが実行を継続したい場合、プログラムは続行されます。しかし、私は実行で問題を抱えています。シンプルな do-while ループでロジックを試していました。単純な do-while ループでも同じ問題が発生します。

Problem is: If the input is yes, the program does not get the further input from user.

その単純な do-while ループは次のとおりです。

#include <stdio.h>

main()
{
    int c;
    char ch;
    do
    {
            printf("enter the no less then 4:");
            scanf("%d",&c); 
        switch(c)
        {
            case 1:
                printf("In 1\n");
                break;
            case 2:
                printf("In 2\n");
                break;
            case 3:
                printf("In 3\n");
                break;
        }
        printf("do u want to continue?:");
        ch=getchar();
    }while(ch=='y');
}

プログラムwhile(ch != 'n')の代わりに置くと、正常に動作します。while(ch=='y')この背後にある問題を理解できませんでした。これを修正するのを手伝ってください。そして、この問題について説明してください。よろしくお願いします。

4

4 に答える 4

2

最初の実行、3 が出力され、ユーザーは「y」と入力してリターンを押します

getchar() は「y」を読み取り、プログラムはループします

2 回目は、getchar() が前回のキー押下から改行文字を読み取ります

改行は「y」ではないため、プログラムはループしません

于 2013-01-17T11:21:30.720 に答える
1

いくつかの問題:

  1. getchar は char ではなく int を返すため、c と同じようにするch必要があります。int
  2. scanf は %d に対応するポインタを必要とするため、次のようにする必要があります。scanf("%d", &c);
  3. は、次のwhileように EOF をテストする必要があります。while ((ch = getchar()) != EOF)
  4. 入力には改行が含まれていることに注意してください。これは処理する必要があります (例: 無視)。

これは非常に堅牢なはずです。

#include <stdio.h>

int main(void)
{
  int c, ch;

  for (;;) {
    printf ("Enter a number (1, 2 or 3):");
    fflush (stdout);
    if (scanf ("%d", &c) == 1) {
      switch (c) {
      case 1:
        printf ("In 1\n");
        break;
      case 2:
        printf ("In 2\n");
        break;
      case 3:
        printf ("In 3\n");
        break;
      }
      printf ("Do you want to continue? [y/n]:");
      fflush (stdout);
      while ((ch = getchar ())) {
        if (ch == 'y')
          break;
        else if (ch == 'n' || ch == EOF)
          return 0;
      }
    } else {
      printf ("That was not a number. Exiting.\n");
      return 0;
    }
  }
}
于 2013-01-17T12:06:09.233 に答える
0

while(ch=='y') または while() 内の文字は、コーディングに従ってケース 3 に送信されます.... y が押されている場合、ケース 3 に送信されます。それ以外の場合は機能しません

于 2013-01-17T11:19:22.887 に答える
0

を使用して答えを読む代わりにgetchar、 を使用しますfgets

他の人が説明したように、2 番目のgetchar呼び出しでは、最初の の後に入力された改行が返されますy
を使用fgetsすると、ユーザーが入力したすべてのものを取得できます。次に、それが正しいかどうかを確認できますy(最初の文字を確認するか、 を使用してくださいstrcmp)。

于 2013-01-17T12:36:17.090 に答える