1. ホーム
  2. c

[解決済み] scanf()を使って、改行が見つかるまで入力から読み込むにはどうしたらいいですか?

2022-01-28 12:02:24

質問

C言語で、入力からスペースがあるまで読み、その後ユーザーがエンターキーを押すまで読むという作業を頼まれたのですが、どうすればいいですか? このようにすると

scanf("%2000s %2000s", a, b);

1番目のルールに従いますが、2番目のルールには従いません。
と書くと

私は賢い

私が得るものは同等である。
a = "I"。
b = "am"。
しかし、それはそうでなければならない。
a = "I"。
b = "am smart"。

すでに試しました。

scanf("%2000s %2000[^\n]\n", a, b);

そして

scanf("%2000s %2000[^\0]\0", a, b);

1つ目では、ユーザーが Ctrl + D (EOFを送信するため)そしてそれは私が望むものではありません。 2番目のものでは、コンパイルできません。コンパイラによると

警告: '%[' フォーマットの終了 ']' がありません。

何か良い解決方法があれば教えてください。

どのように解決するのですか?

scanf (およびその仲間)には、ちょっと奇妙な特徴があります。書式文字列の(ほとんどの場所にある)空白が、入力の任意の量の空白と一致するのです。たまたま、少なくともデフォルトの "C" ロケールでは、改行がホワイトスペースとして分類されるのです。

つまり、末尾の '\n' だけでなく a 改行だけでなく、その後に続くすべての空白文字も同様です。入力の終わりを告げるか、空白でない文字を入力するまで、マッチしたとはみなされません。

その対処法として、次のようなものがあります。

scanf("%2000s %2000[^\n]%c", a, b, c);

if (c=='\n')
    // we read the whole line
else
    // the rest of the line was more than 2000 characters long. `c` contains a 
    // character from the input, and there's potentially more after that as well.

また、状況によっては scanf これは、成功した変換の数を教えてくれます。この場合、以下のものを探します。 3 は、すべてのコンバージョンが成功したことを示します。