コードを一度に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回ループする
- (最初のループ)
4
nに読み込む
- 行の残りの部分(空白)を
str
、に読み込みます
- 空白行を印刷する
- (2番目のループ)
- 整数をnに読み込もうとしますが、入力(
anil kuma
)は整数ではないため、stdinにエラーフラグを設定します
- 行の残りの部分(
anil kuma
)をstrに読み込みます
- プリント
anil kuma
- (3番目のループ)
2
nに読み込む
- 行の残りの部分(空白)を
str
- 空白行を印刷する
- ループが完了したら、終了コード34を返します。
関数の戻り値やstdinのエラーコードをチェックすることは決してないので、2回目の反復で整数を読み取ろうとしてエラーが発生したという事実は完全に見えません。
scanf呼び出しを次のように変更すると、期待どおりの出力が得られる場合があります。
scanf("%d ", &n);
%d変換後の余分なスペースに注意してください。これにより、scanfは、空白以外の文字が見つかるまで、whiletespaceを読み取って破棄します。これにより、整数の後の改行、後続の空白行、および次の非空白行の先頭にあるスペース/タブが破棄されます。