3

プログラムは次のとおりです。

#include "stdio.h"

int main()
{
    int minx, x, y, z;

    printf("Enter four ints: ");
    scanf( "%i %i %i %i", &minx, &x, &y, &z);

    printf("You wrote: %d %d %d %d", minx, x, y, z);
}

次のように入力したら、1 2 3 4 と入力します (次に を押しenterます)。入力バッファを実行して読み取りますscanf()= 1 (スペース) 2 (スペース) 3 (スペース) 4 (スペース)(\n) (\n) まで読み取り、\n はバッファに残ります。

次のように入力した場合: 1 (次に を押すenter) 2 (次に を押すenter) 3 (次に を押すenter) 4 (次に を押すenter)。入力バッファを実行して読み取りますscanf()= 1(\n)2(\n)3(\n)4(\n)(\n)。

これらの 2 つのケースでscanf()は、改行、空白をスキップし、int.

しかし、 1 を入力すると (次に を押しますenter)(次に を押しenterます)...を押しscanf()続けると、 は実行されませんenter

私の質問は次のとおりです。何がトリガーされますscanf()か? すべての正しい%dものがバッファに配置されたことを認識した後にのみ実行され、ユーザーがEnterキーを押した場合に実行されますか?

4

2 に答える 2

4

scanf()空白は無視され、空白には改行が含まれるためです。

scanf()毎回同じ方法で 4 つの数字を処理します。空白をスキップしてから、数字のように見える候補シーケンス (記号と数字) を読み取り、候補シーケンスの一部にならない最初の文字で読み取りを停止します。 ; 次に、候補シーケンスを変換します (オーバーフローなどの動作は未定義)。4(単なる改行ではなく)の後にスペースを入力した場合、スペースと改行の両方が次に読み取られるのを待っています。スペースがない場合、改行は読み取られるのを待っています。

数字以外の文字 (句読点または文字) を入力するscanf()と、エラーが返されます (または、文字が 4 番目の数字の後にある場合を除き、4 つ未満の数字が変換されます)。

単一の数字の後に任意の数の改行を入力すると、単にscanf()スキップする空白を与えているだけです。EOF (ゼロバイト読み取り) または読み取りエラー (または、数字ではなく文字や句読点などの変換エラー) を取得するまで停止しません。

于 2012-04-10T03:30:44.993 に答える
1

これは scanf の予想される動作です。 c99 標準から:

変換仕様は次の手順で実行されます。

区切り文字(スペース、タブ、改行など)でトークン化します.最後の改行はトークン化の一部です..そうでなければ、整数がいつ終了するかをどのように知ることができますか?:D

これであなたの質問は解決したと思いますか?私はわかりません 。お役に立てれば

于 2012-04-10T03:38:13.373 に答える