12,788
回編集
38行目: | 38行目: | ||
* 再度<code>scanf</code>関数を使用する場合に備えて、残った改行は<code>%*c</code>で読み飛ばす。<br>これにより、保持されていた入力データは全て処理されたことになる。<br>ただし、次に読み取るものが<code>%d</code>等の数値である場合には、<code>%*c</code>で読み飛ばさなくても特に影響はない。 | * 再度<code>scanf</code>関数を使用する場合に備えて、残った改行は<code>%*c</code>で読み飛ばす。<br>これにより、保持されていた入力データは全て処理されたことになる。<br>ただし、次に読み取るものが<code>%d</code>等の数値である場合には、<code>%*c</code>で読み飛ばさなくても特に影響はない。 | ||
<br> | <br> | ||
また、< | また、<u>scanf関数は、正常に読み取れた場合は変数に格納したパラメータの数を返すため</u>、この数を確認して成功したかどうか判定することができる。<br> | ||
< | 例えば、<u>%255[^\n]%*[^\n]</u>を実行した場合の戻り値は、以下に示すようになる。<br> | ||
* | * 1文字以上の読み込みに成功した場合は、<code>1</code> | ||
* | * 改行のみが入力された場合は、<code>0</code> | ||
* | * 未入力の状態において、[Ctrl] + [D]キー (Linux) または [Ctrl] + [Z]キー (Windows)でEOFが入力された時は、EOF (EOF定数の値 : -1) | ||
* | * また、読み込みに失敗した場合は、<u>return 1;</u>等としてプログラムを異常終了扱いにするとよい。 | ||
<br> | |||
<code>%255[^\n]%*[^\n]</code>の場合<br> | |||
* %255 | |||
*: 最大255文字まで読み込む。 | |||
* [^\n] | |||
*: 改行以外の文字を読み込む。 | |||
* %*[^\n] | |||
*: 改行以外の残りの文字を読み込むが破棄する。 | |||
*: バッファオーバーフロー防止 | |||
<br> | |||
例えば、"aaa\nbbb\nccc\nddd"と入力された場合、変数には"aaa"のみが格納される。<br> | |||
これは、[^\n]は最初の改行文字で読み込みを停止、残りの"bbb\nccc\nddd"は%*[^\n]で破棄されるためである。<br> | |||
これにより、1行のみを安全に読み込むことが可能となる。<br> | |||
<br> | <br> | ||
以下の例では、必ず1文字以上入力させている。<br> | 以下の例では、必ず1文字以上入力させている。<br> | ||
58行目: | 71行目: | ||
return 1; | return 1; | ||
} | } | ||
scanf("%*c"); | scanf("%*c"); | ||