表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
10/37

第八話 scanf関数の問題



「このscanf関数は、とにかく問題の多い関数なのよ。たとえばね、プログラムは数字を受け取る設定になっているけど、もしここで文字を入れてみたら、どうなると思う?」

 先輩はそう言うと、再びコマンドプロンプトよりプログラムを立ち上げた。


C:¥sample>calcprogram2

最初の数を入れてね :


先輩はaを入力するとエンターキーを押した。

すると――


「次の数を入れてね」 は受け取ることもなく、結果が即表示された。


14 + 5318568 の答えは、5318582です!


C:¥sample>_


「こ、これはっ!?」

「……そう。これがscanf関数の問題の一つ。間違った入力を受けたら、おかしくなっちゃうの」

「うむむ……」

「Cは入力や出力、あとエラー表示には、stdin、stdout、stderrの三つのストリームっていうのを使っているわ。この中のstdinストリームに入力された文字が一時的に保存されていて、そこからscanf関数によって読み込まれる訳だけど――」

「……」

 俺は茫然としてモニターを眺めるのみで、先輩の言葉が耳に入らなかった。

「受け取るのに失敗したら、間違ってる文字はそのまま入力ストリーム内に残るし、エンターキーの改行文字もそう。これが、二回目の入力を飛ばされた原因ね」

「……つまりは、どういう事なんですか?」

「要するに、scanfはそのまま使うには、危険な関数だってことよ。バッファオーバーフロー・ハッキングのターゲットにもなってるしね。でも困ったことに、他の入力関数で初心者向けの関数もCには無いのよねー。で、少し、高度な内容になっちゃうけど、これからは入力には、こうするわ」


 先輩は、ウィンドウズのメモ帳を開くと、隅にこう書いた。



char buf[100];

int a;

fgets(buf, 100, stdin);

sscanf(buf,"%d", &a);



「char?」

「英語で文字、characterの意味の型よ。さらに後ろの[100]で、配列化させて、100文字分を入れられる変数にしてあるの。ここに入力した文字を入れていくわけ。で、fgets関数で、一行分の文字列の入力を受け取って、buf配列に入れて、sscanf関数でそのbuf文字列を%dフォーマットで変数aに変換して代入する。sscanf関数は、文字列を相手に使うscanf関数だと思って」

「これで問題なくなると?」

「実は、これもまだ完全じゃないんだけど……」先輩はえへへ、と困った表情になる。「ま、よっぽど変なことしなければ、これで問題ないと思うわ」

「うーむ。結構面倒だな」

「イツキくんはあまり考えなくていいわよ。これは、ちょっと初心者には高度な内容だからね。ま、少なくとも、scanf("%100s%*[^\n]%*c", buf);なんて書くよりも、ずっとわかりやすいだろうしー」

 先輩の言葉を俺は理解できずに、きょとんとさせられた。

「なっ……なんですか、今のは」

「おほほほ。気にしないで。これはC使いの上級魔術師達のみが知る秘密術式なのだヨ」

 先輩は冗談めかして言いつつ、コンソールを閉じる。

 なにが魔術師だよ、まったく。


 そう思った時、扉がこんこん、と叩かれた。

「すみませーん。電算部はこちらですかー?」

 聞きなれた声。

 この声は――西原さんだ!

評価をするにはログインしてください。
この作品をシェア
Twitter LINEで送る
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ