2

次の入力があります。

2
2 5
4 6
1
1 1

ここで、最初の各数値は、続くケースの数をエンコードします。これは、ACM の問題ではかなり一般的です。私はそれを使用してそれを成功させようとしましたfgetssscanf私はいつもとにかくこれをやってしまいます:(、しかし好奇心から、単に使用する方法はありますscanfか?

scanf("%d",&x)
for (f=0;f<x;f++) {
  scanf("%d %d", &a, &b);
}

それはうまくいくでしょうか、単にを使用するより良い方法はありscanfますか?

4

1 に答える 1

2

オンライン審査員に期待できるように、入力が整形式である場合、パターンは機能します。

入力とループの例では、 までの入力'6'が消費され、その後の改行は次のscanf呼び出しでスキップされます。

これは通常、すべてループ内またはそのようなものです。最初の scanf でwhile(1)テストするにはどうすればよいですか?EOF

テストケースの数がなく、入力の終わりを自分で検出する必要がある場合は、 の戻り値を使用しますscanf

while(scanf("%d", &x) == 1) {
    for(f = 0; f < x; ++f) {
        scanf("%d%d", &a, &b);
        /* do something clever */
    }
 }

変換が失敗した場合は、入力の終わりに達したか、入力の形式が正しくないか、入力ストリームが破損しています。これらのケースのいずれにおいても、回復することはできません。

于 2013-04-30T01:02:53.083 に答える