web-dev-qa-db-ja.com

getchar();の使用方法がわかりません。 Cで

_#include <stdio.h>
int main(void)

{
    char F,C;

    printf("Do you have a Fever? y/n\n");
    F = getchar();

    printf("Do you have a runny nose or cough? y/n\n");
    C = getchar();


    printf("Here are the results you input:\n");
    printf("Do you have a fever?");
    putchar(F);

    printf("\nDo you have a runny nose or cough?");
    putchar(C);

    return 0;
}
_

コード入力は、最初のgetchar();の結果であり、その後、入力を待たずに終了します。何故ですか?

5
user2824931

1文字だけを処理する場合は、各getchar()の後にwhileループを使用します

printf("Do you have a Fever? y/n\n");
F = getchar();
while((F = getchar()) != EOF && F != '\n') // This will eat up all other characters
    ;

printf("Do you have a runny nose or cough? y/n\n");
C = getchar();
while((C = getchar()) != EOF && C != '\n')
    ;
6
haccks

まず、getchar()intではなくcharを返します。これは、任意の有効な文字(CHAR_BITが8のシステムでは値0..255として)と別の値(通常は-1)をEOFとして返すことができるようにするためです。

次に、ユーザーが回答を入力すると、情報には文字(YまたはN、希望)と改行が含まれます。先頭に空白がある可能性があります。後続のゴミがある可能性があります。

したがって、Fはおそらく最初の文字を取得します。 Cは、さらなる入力を待たずに、改行を読み取ります。

行を読み取り、それぞれを順番に処理する場合は、fgets()を使用して行を読み取り、sscanf()を使用して結果を解析します。または、以下のget_answer()関数など、同様の処理をカプセル化する関数を使用します。

_#include <stdio.h>

extern int get_answer(void);    /* Declare in a header? */

int get_answer(void)
{
    int c;
    int answer = 0;
    while ((c = getchar()) != EOF && c != '\n')
    {
        if (answer == 0 && (c == 'y' || c == 'n'))  // Upper-case?
            answer = c;
        /* ?check for garbage here and complain? */
    }
    return answer;
}

int main(void)
{
    int F,C;

    printf("Do you have a Fever? y/n\n");
    F = get_answer();

    printf("Do you have a runny nose or cough? y/n\n");
    C = get_answer();

    printf("Here are the results you input:\n");
    printf("Do you have a fever? %c\n", F);
    printf("Do you have a runny nose or cough? %c\n", C);

    return 0;
}
_

一般に、改行は出力の最後にあることに注意してください。入力がインタラクティブセッションのプロンプトと同じ行に表示されるように、プロンプトメッセージからそれらを省略できます。呼び出し元のコードは実際にはEOFを適切に処理しません—使用によってEOF条件がトリガーされます(入力することにより) Control-D たとえば)データを入力する前。 get_answer()のコードはOKです。 main()のコードは、ゼロリターンをテストする必要があります。

10

文字を入力すると、Fに格納され、Enterキーを押すと、stdinバッファに格納され、次のgetchar()が来ると、stdinバッファからの入力が読み取られます。このため、すべてのgetcharの前にfflush(stdin)を使用します。 () あなたが使う。

2
arvind

これは、Enterキーを押すと、最初の質問に答えた後、Enterキーが次の変数Cに格納されるためです。これを修正するには、別のgetcharを記述して、余分なEnterキーを使い果たします。

そのはず :-

#include <stdio.h>
int main(void)

{
char F,C;

printf("Do you have a Fever? y/n\n");
F = getchar();

getchar(); /* takes the enter key */

printf("Do you have a runny nose or cough? y/n\n");
C = getchar();

getchar(); /* takes the enter key */

printf("Here are the results you input:\n");
printf("Do you have a fever?");
putchar(F);

printf("\nDo you have a runny nose or cough?");
putchar(C);

return 0;
}
2
Abhishek