「C言語の基礎 - 標準入力から安全に文字列を取得する」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の1版が非表示)
36行目: 36行目:
* %sは全ての空白文字(半角スペースも含む)を無視するため、%sの代わりに%[^\n]と指定することで、無視する対象を改行だけに限定できる。<br>例えば、<code>%255[^\n]</code>は、改行以外の文字列を1〜255文字読み込むことを意味する。
* %sは全ての空白文字(半角スペースも含む)を無視するため、%sの代わりに%[^\n]と指定することで、無視する対象を改行だけに限定できる。<br>例えば、<code>%255[^\n]</code>は、改行以外の文字列を1〜255文字読み込むことを意味する。
* <code>%</code>の代わりに<code>%*</code>を使用すると、その部分を読み飛ばすことができる。<br>例えば、256文字以上入力する場合、最初の255文字までを受け取り、残りを捨てる場合は、<code>%255[^\n]%*[^\n]</code>と記述する。
* <code>%</code>の代わりに<code>%*</code>を使用すると、その部分を読み飛ばすことができる。<br>例えば、256文字以上入力する場合、最初の255文字までを受け取り、残りを捨てる場合は、<code>%255[^\n]%*[^\n]</code>と記述する。
* 再度<code>scanf</code>関数を使用する場合に備えて、残った改行は<code>%*c</code>で読み飛ばす。<br>これにより、保持されていた入力データは全て処理されたことになる。<br>ただし、次に読み取るものが<code>%d</code>等の数値である場合には、これをしなくても特に影響はない。
* 再度<code>scanf</code>関数を使用する場合に備えて、残った改行は<code>%*c</code>で読み飛ばす。<br>これにより、保持されていた入力データは全て処理されたことになる。<br>ただし、次に読み取るものが<code>%d</code>等の数値である場合には、<code>%*c</code>で読み飛ばさなくても特に影響はない。
<br>
<br>
また、<code>scanf</code>関数は正常に読み取って変数に格納できたパラメータの数を返すので、これを成功したかどうかの判定に用いることができる。<br>
また、<u>scanf関数は、正常に読み取れた場合は変数に格納したパラメータの数を返すため</u>、この数を確認して成功したかどうか判定することができる。<br>
<code>%255[^\n]%*[^\n]</code>を実行した場合の戻り値は、以下のようになる。<br>
例えば、<u>%255[^\n]%*[^\n]</u>を実行した場合の戻り値は、以下に示すようになる。<br>
* 1文字以上読み取れたときは <code>1</code>
* 1文字以上の読み込みに成功した場合は、<code>1</code>
* 改行だけが入力されたときは <code>0</code>
* 改行のみが入力された場合は、<code>0</code>
* 最初から [Ctrl] + [D](Linux)または[Ctrl] + [Z](Windows)でEOFが入力された時は、EOF(EOF定数の値 : -1)
* 未入力の状態において、[Ctrl] + [D]キー (Linux) または [Ctrl] + [Z]キー (Windows)でEOFが入力された時は、EOF (EOF定数の値 : -1)
* 失敗した場合は、<code>return 1;</code>としてプログラムを異常終了扱いにするとよい。
* また、読み込みに失敗した場合は、<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");