0
   int main( )
    {
        char str[200];
        int n,tc;
        scanf("%d",&tc);
        while(tc--)
         {
           scanf("%d",&n);
           gets(str);
           puts(str);
        }
    return 34;
    }

このコードがスキャンされない理由 文字列の(str)はtcに等しい?
プラットフォームUBUNTU10.04

4

3 に答える 3

3

これが私のマシンで得られるものです:

vovanium@microvovanium:~/tmp$ cc whoa.c 
whoa.c: In function ‘main’:
whoa.c:4: warning: incompatible implicit declaration of built-in function ‘scanf’
/tmp/cc1r5dZe.o: In function `main':
whoa.c:(.text+0x4b): warning: the `gets' function is dangerous and should not be used.
vovanium@microvovanium:~/tmp$ ./a.out 
3
12qwe
qwe
34asd
asd
56zxc
zxc

それでスキャンするようです。

K&R C を使用しているようですが、お勧めできません。ANSI/ISO C 標準を使用します。

  1. いいえ#include <stdio>、プログラムの開始です。scanf()gets()およびを使用する必要がありputs()ます。printfandなどの可変引数関数を使用する場合に特に必要ですscanf(したがって、私のコンパイラは文句を言います)。
  2. main() のパラメーターの型を宣言していません。メインにはプロトタイプがありint main(int argc, char *argv[])ます。
  3. 関数パラメーターをローカル変数として使用し、関数本体で宣言することをお勧めします。あなたが持っている必要があります:int tc;int n;の直後{
  4. main() から返される可能性のある値は で定義されて<stdlib.h>おりEXIT_SUCCESS、またはEXIT_FAIL一般的に使用される 0 または 1 にすることができます (もちろん、他の値を使用することもできますが、環境内で意味があることを確認する必要があります。
于 2011-12-26T20:49:00.787 に答える
1

コードを一度に1行ずつ(多かれ少なかれ)分解してみましょう。

scanf("%d",&tc);

整数をtcに読み込みます。

while(tc--)

tc回ループします

    scanf("%d",&n);

整数をnに読み込みます

    gets(str);

行の残りの部分をに読み込み、str末尾の改行を削除します

    puts(str);

文字列を出力し、その後に改行を続けます

つまり、整数を読み取ってから、その整数と残りの行のペアを読み取って、行を出力します(ただし、整数ではなく、それらは破棄されます)。整数の読み取りには、整数の前の空白スペース(スペース、タブ、および空白行全体)をスキップする必要がありますが、整数の後はスキップしないため、プログラムに入力する入力の種類によっては、少し混乱する可能性があります。

あなたの例では、あなたはそれに入力を供給していると言います:

3
4
anil kuma
2
abc
4
ams

それでは、プログラムを調べて、それが何をするかを見てみましょう。

  • 整数3をtcに読み込みます
  • 3回ループする
  • (最初のループ)
    • 4nに読み込む
    • 行の残りの部分(空白)をstr、に読み込みます
    • 空白行を印刷する
  • (2番目のループ)
    • 整数をnに読み込もうとしますが、入力(anil kuma)は整数ではないため、stdinにエラーフラグを設定します
    • 行の残りの部分(anil kuma)をstrに読み込みます
    • プリントanil kuma
  • (3番目のループ)
    • 2nに読み込む
    • 行の残りの部分(空白)をstr
    • 空白行を印刷する
  • ループが完了したら、終了コード34を返します。

関数の戻り値やstdinのエラーコードをチェックすることは決してないので、2回目の反復で整数を読み取ろうとしてエラーが発生したという事実は完全に見えません。

scanf呼び出しを次のように変更すると、期待どおりの出力が得られる場合があります。

scanf("%d ", &n);

%d変換後の余分なスペースに注意してください。これにより、scanfは、空白以外の文字が見つかるまで、whiletespaceを読み取って破棄します。これにより、整数の後の改行、後続の空白行、および次の非空白行の先頭にあるスペース/タブが破棄されます。

于 2011-12-26T20:59:48.980 に答える
1

わかった、エラーが並んでいる

 scanf("%d", &n);

%dの後にスペースが必要です

 scanf("%d ", &n);
于 2011-12-26T21:23:00.653 に答える