C で scanf を使用して入力を解析する

c P101」と入力すると " プログラムは実際に "c P101\n を受け取ります "。ほとんどの変換指定子は、改行を含む先頭の空白をスキップしますが、 %c ではない。 「\n」までの最初のすべて " が読み込まれ、2 回目は "\n" が command に読み込まれます 、「c " は prefix に読み込まれます 、および "P " が残っているため、変換は失敗し、"P101\n " がストリームに残っています。次回は "P " はコマンド "1" に格納されます "がprefixに格納され、1 (残りの "01 から ") は "\n で入力に格納されます " はまだストリームにあります。フォーマット文字列の先頭にスペースを入れることで、この問題を解決できます。これにより、改行を含む先頭の空白がスキップされます。

q」と入力すると、2 番目のケースでも同様のことが起こります。 ", "q\n " がストリームに入力され、"q のあたりで初めて " が読み込まれ、2 回目は "\n " が読み取られ、3 番目の呼び出しでのみ 2 番目の "q フォーマット文字列の先頭にスペース文字を追加することで、この問題を回避できます。

これを行うより良い方法は、fgets() のようなものを使用して一度に 1 行ずつ処理し、次に sscanf() を使用して解析を行うことです。