0

以下に印刷されたプログラムでは、 gets () の問題は、データを初めて取得するだけであり、その後のすべての呼び出しでヌルになることです。これは、番号の入力中に istream に残った \n の迷子が原因です。

main()
{
    char name[20];
    int number;
    for(int i=0;i<5;i++)
    {
        printf("enter name");
        gets(s);
        printf("enter phone number");
        cin>>a;
    }
}

ここで私の質問は、scanf()orを使用したときに同じことが起こらないのはなぜcinですか? cin と gets() が値を取得する方法の違いは何ですか? cin (および scanf ) が正常にその迷子を離れることを可能にします\nが、そうではありませんgets()か?

PS: fgets() については知っていますが、gets() は非推奨であり、悪影響があるため、通常は使用しません。

4

3 に答える 3

2

行指向の入力とフィールド指向の入力を混在させています。gets()、などの関数はfgets()を読み取ります。必ずしも行の内容を気にする必要はありませんが、行全体を読み取ります (場合によってはスペースがある場合)。

cin>>演算子のようなフィールド指向の入力はscanf()、行を気にせず、フィールドを気にします。のような呼び出しscanf("%d %d %d", &x, &y, &z);は、それらが同じ行にあるか、3 つの別々の行にあるか (または空白行を残しても) は気にしません。

これらのフィールド指向の入力関数は、行指向の入力関数を混乱させる改行文字を残す傾向があります。一般に、この 2 つを混在させることは避けてください。両方を行いたい場合は、行を読み取ってから使用するsscanf()stringstream、そこからフィールド ベースの入力を行うと便利なことがよくあります。'\n'これにより、不正な入力からの回復も少し簡単になり、次の入力関数を待っている余分な文字があるかどうかを心配する必要がなくなります。

于 2012-06-11T20:06:54.030 に答える
1

scanfどちらも空白で区切られたフィールドをcin >>読み取り、先頭の空白を無視します。現在、ホワイトスペースはスペース、タブ、および改行であるため、入力に余分な改行が含まれていても問題ありません。さらに重要なことは、何かを読み取った後、次の読み取り呼び出しのために入力に残しておく代わりに、次の空白を読み取らないことです。

scanfでは、フォーマット文字列の最後にスペースを使用して、できる限り多くの空白を読み取る (そして破棄する) ように明示的に指示できますが、インタラクティブな入力ではうまく機能しません。非ホワイトスペースを取得します。したがって、ループの最後を次のように変更すると:

printf("enter phone number");
scanf("%d ", &a);

電話番号を入力した後にハングしているように見えます。これは、最終的に次のループ反復で次の名前として読み取られる空白以外の文字を入力するのを待っているためです。

scanf を使用して、必要なことを行うことができます-電話番号に続く改行までのテキストを読んで消費します-しかし、それはきれいではありません:

scanf("%d%*[^\n]", &a); scanf("%*1[\n]");

改行と、行にある可能性のあるスペースやその他の不要なものを消費するには、実際には 2 つの scanf 呼び出しが必要です。

于 2012-06-11T21:40:57.153 に答える
0

gets()は、 とは異なり、終了改行をヌル文字に置き換えるfgets()必要があります。 これはmanページからのものです:
gets()

gets() 関数は、標準入力ストリーム stdin から s が指す配列にバイトを読み取ります。いずれも破棄され、配列に読み込まれた最後のバイトの直後に null バイトが配置されます。」

ただしfgets()、改行を変更せずに渡します。

fgets() 関数は、n-1 バイトが読み取られるか、a が読み取られて s に転送されるか、またはファイル終了条件が検出されるまで、ストリームから s が指す配列にバイトを読み取ります。その後、文字列は null バイトで終了します。

だから、あなたの実装は準拠していないようです...私のものは述べたように動作します。

于 2012-06-11T20:11:04.620 に答える