1

今日はC言語でテストしていて、2つの小さなcファイルを作成しました

main.c

#include<conio.h>
void testing();
int main()
{
    testing();
    getch();
    return 0;
}

testing.c

#include <stdio.h>

void testing()
{
    char ch;
    printf("Hello Testing\n");
    do{
        printf("Enter Character : ");
        ch=getchar();
        printf("You Entered : %c\n",ch);
        testing();
        }while(ch!='N');
}

私が直面している問題は、ユーザーから1文字を読み取ってから2回ループし、理由がわからないことです

output
Hello Testing
Enter Character : k //(i entered k)
You Entered : k

Hello Testing// why this is displayed twice??
Enter Character : You Entered :// i don't press any key and it moves to next iteration

Hello Testing
Enter Character : // here i can enter character again and it happens again twice

Visual Studio 2012 でコンパイルしました。

4

4 に答える 4

4

getchar()入力バッファに改行文字を残すためです。別の getchar() を使用して、改行を食べることができます。

ch=getchar();
getchar();

または scanf を使用して先頭の空白を食べます:

scanf(" %c", &ch);

このようにして、以前のものはすべて\n無視されます。

于 2012-10-19T15:34:26.127 に答える
2

文字を印刷した後、 を再度呼び出しますtesting()。これにより、テストがループします。この行を削除すると、問題ありません。

意図的にしなかったのはrecursionです。これはコンピューター プログラミングの情熱的な側面ですが、意図したことではありません。

もう1つ、入力を検証するためにEnterキーを押したときに入力バッファに残った改行を消費するために、もう一度読み取ることを考えてください。

于 2012-10-19T15:34:00.600 に答える
2

ループ内で testing() 関数を再帰的に呼び出すと、問題が発生する可能性があります。

于 2012-10-19T15:38:32.037 に答える
0

そこに再帰があるため、2回表示されますが、この関数は無限再帰を行うために何をするのでしょうか?

于 2012-10-19T15:34:26.250 に答える