1

以下は私のCコードです。

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int ch;

    do
    {
        printf("\n1.create\n2.display\n3.exit\n\t");
        printf("Enter your choice:: ");
        scanf("%d",&ch);
        printf("choice = %d\n\n", ch);
        if(ch==32767)
            return 0;
        switch(ch)
        {
            case 1:
                printf("\n Case 1 executed\n");
                break;
            case 2:
                printf("\nCase 2 executed\n");
                break;
            case 3:
                printf("\nExit\n");
                exit(0);
                break;
            default:
                printf("Wrong choice!!!");
                break;

        }
    }while(ch!=3);
    return 0;
}

問題は、chに整数値を入力しているときに、正常に機能していることです。しかし、文字を入力すると、無限ループで実行されます。

誰でもそれを解決できますか。

4

2 に答える 2

2

文字を処理できるようにcharする場合は、の代わりに値を使用する必要があります。int

その場合、 -文字は-整数とは異なるswitch-caseため、ステートメントも変更する必要があります。修正されたコードは次のようになります。'1'1

#include <limits.h>

int main()
{
    char ch;

    do
    {
        printf("\n1.create\n2.display\n3.exit\n\t");
        printf("Enter your choice:: ");
        scanf("%c",&ch);
        printf("choice = %c\n\n", ch);
        switch(ch)
        {
            case '1':
                printf("\n Case 1 executed\n");
                break;
            case '2':
                printf("\nCase 2 executed\n");
                break;
            // case 32767: - can not be stored in a char variable
            case 127:
            case CHAR_MAX: // these two are almost equivalent, but the
                           // second one is better because it relies on
                           // library defined constant from limits.h
            case '3':
                printf("\nExit\n");
                exit(0);
                break;
            case 'a':
                printf("\nA character case accepted!\n");
                break;
            default:
                printf("Wrong choice!!!");
                break;

        }
    }while();
    return 0;
}

while()ブレーク条件も冗長であるため、引数として除外したことに注意してください。これは、switchステートメント内ですでにチェックされています。

また、その例を確認できるように、文字を解析するエラーのないケースを追加しました。

もう1つの注意:古いコードはとの両方011有効な選択肢として受け入れる必要がありますが、新しいコードは012つの異なる選択肢(1つの選択肢== 1文字)として解析されます。

  • 0間違った選択として解析されます
  • 1ケース1の正しい選択として解析されます

また、修正されたコードスニペットのコードコメントで、あなたのコードから他のいくつかのことについてコメントしました。(Jerry Coffinがコメントで指摘したように)「不可能」を取り出して、より適切な場所に置き、定数を意味のあるものに置き換えました。

于 2012-05-10T14:08:43.187 に答える
-3

使用するscanf ("%*[^\n]\n");

ここでは、scanf( "%d"、&ch);を使用しました。これは整数値を正しく読み取りますが、整数以外の値を指定するとすぐに終了するか、異なる出力が表示されます。 Why this is happening ? @有効または無効のいずれかの値を入力するたびに、そこから読み取られた値の後に入力バッファリーダーに配置されるため、問題が発生しています。

scanfに関する詳細情報:http://en.wikipedia.org/wiki/Scanf_format_string

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int ch;

    do
    {
        printf("\n1.create\n2.display\n3.exit\n\t");
        printf("Enter your choice:: ");

        scanf ("%*[^\n]\n");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1:
                printf("\n Case 1 executed\n");
                break;
            case 2:
                printf("\nCase 2 executed\n");
                break;
            case 3:
                printf("\nExit\n");
                exit(0);
                break;
            default:
                printf("Wrong choice!!!");
                break;

        }
    }while(ch!=3);
    return 0;
}
于 2012-05-10T18:31:26.267 に答える