17

getchar()次のコードでの の役割について混乱しています。つまり、キーを押したときにのみ閉じられる出力ウィンドウを確認するのに役立ちEnterます。

基本的には、 Entergetchar()キーを押してから 1 文字を読み取るのを待っています。

この関数が読み取っている単一の文字は何ですか? 読み取るためにキーボードからキーを押しませんでした。

何も読み取っていないのに、「ねえ、あなたは私が読むために何も入力していません」というエラーが表示されないのはなぜですか?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
4

6 に答える 6

11

これは、getchar() がブロッキング関数であるためです。

基本的にプロセスが何かが起こるのを待つようにするブロッキング関数について読む必要があります。

この待機動作の実装は関数によって異なりますが、通常は何らかのイベントが発生するのを待つループです。

関数の場合getchar()、これはおそらく、ファイル (この場合は stdin) を常に読み取り、ファイルが変更されたかどうかをチェックするループとして実装されます。ファイルが変更された場合、ループは別の処理を実行します。

于 2010-03-09T10:11:23.517 に答える
9

このgetchar()関数は、文字を受信するまで単に待機し、受信するまでプログラムを保留します。

エンターキーを押すと文字が送信されます。Windows OS では、キャリッジ リターン (CR) とライン フィード (LF) を送信します。

適切な説明については、この CodingHorror の投稿を参照してください。

getchar()(...ブロッキング部分ではなく、CR + LF部分の説明)

于 2010-03-09T10:12:13.713 に答える
4

これを試して:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char ch;

    printf("I'm now going to block until you press something and then return... ");

    ch = getchar();

    if (ch >= 0)
       printf("\nYou pressed %c\n", ch);
    else
       printf("\nAliens have taken over standard input! Run!\n");

    return 0;
}

getchar()キーボード(またはstdinに接続されているもの)割り込みが受信されるまで、プログラムをスリープ状態にします。これはブロックしていることを意味し、getchar()戻るまで追加のコードは実行されません。

関数を理解するために、関数の戻り値を調べることは非常に役立ちます。

ブロックを防止するメカニズムを提供しない限り、どの関数もブロックする可能性があります。たとえば、モデムなどの応答が遅いデバイスを開くのに役立つフラグをopen()許可します。O_NONBLOCKつまり、ターミナルから入力を取得したり、カーネルやデバイスからの応答を待つ必要がある場合は、ブロックされる可能性が非常に高くなります。

于 2010-03-09T10:20:08.143 に答える
2

getchar() は、キーが押されるまでプログラムの実行をブロックします。したがって、キーが押されていなくてもエラーは発生しません。 getchar() はそれが発生するのを待ちます:)

于 2010-03-09T10:12:00.380 に答える
1

ここで getchar の動作について詳しく知ることができます: http://www.cppreference.com/wiki/c/io/getchar ...これはあなたの質問に答えるはずです:)

于 2010-03-09T10:12:26.103 に答える