異常な入力が行われた時の処理とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 異常な入力が行われた時の処理の意味・解説 

異常な入力が行われた時の処理

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/23 00:15 UTC 版)

scanf」の記事における「異常な入力が行われた時の処理」の解説

scanf関数は、予期せぬ値が入力されると、その値を読み込まずストリーム上に残してしまう。例えint i;scanf("%d", &i); としたコードがあった場合入力数字でなかった場合scanfストリームにその文字列残したまま終了することになる。このため次に scanf呼ばれたときはそのストリーム上のバッファ実引数代入され、他の scanf にも異常な結果返すことになる。例として 1 が入力されたら終了それ以外もう一度入力求めるようなプログラム考えてみる、もしこのプログラムint i;while(1) { scanf("%d", &i); if (i == 1) { break; }} というようなコード記述した場合数字以外の文字入力してしまうと無限ループ陥ることになる。このような現象を防ぐ手段として scanf戻り値利用する方法とられる。これは scanf代入成功した変数の数を戻り値として返すため、指定した実引数の数と scanf戻り値一致しないときに入力バッファクリアすることで回避できる例え上記例の場合は以下のようになるint i;while(1) { if (scanf("%d", &i) != 1) { scanf("%*s"); if (feof(stdin)) { /* エラー処理 */ } continue; } if (i == 1) { break; }} 入力バッファクリアはここでは文字列を空読みすることで実現している(入力バッファクリア方法状況によって異な方法考えられる)。なお主ウェブ上などで、標準入力のバッファクリアの方法fflush(stdin) や rewind(stdin) とする方法紹介されることがあるが、ANSI規格ではこれらの動作未定義であり、正し動作保障するものではない。 この方法でエラー処理をする場合には上記空白文字取り扱い関連問題になることがある例えint i, j;scanf("%d %d", &i, &j); のようなコードで、異常な入力があった場合エラー処理をしたいとする。これを int i, j;if (scanf("%d %d", &i, &j) != 2) { エラー処理} という方法実現する入力が "1" のみの場合空白改行同一視されしまうため、変数 "i" に 1 を入力して後、変数 "j"の入力待ち態となる。もし、このような場合にもエラー処理実行したい場合には、例えば以下のように一度文字列として読み込んでその後 sscanf読み込むことで実装すればよい。 char a[20];int i, j;scanf("%19[^\n]%*[^\n]", a);getchar();if (sscanf(a, "%d %d", &i, &j) != 2) { エラー処理}

※この「異常な入力が行われた時の処理」の解説は、「scanf」の解説の一部です。
「異常な入力が行われた時の処理」を含む「scanf」の記事については、「scanf」の概要を参照ください。

ウィキペディア小見出し辞書の「異常な入力が行われた時の処理」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「異常な入力が行われた時の処理」の関連用語

異常な入力が行われた時の処理のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



異常な入力が行われた時の処理のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのscanf (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS