小説『緑ヶ丘高校電算部ゲーム製作記』
作者:芳野()

しおりをはさむ/はずす ここまでで読み終える << 前のページへ 次のページへ >>

第八話 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使いの上級魔術師達のみが知る秘密術式なのだヨ」
 先輩は冗談めかして言いつつ、コンソールを閉じる。
 なにが魔術師だよ、まったく。

 そう思った時、扉がこんこん、と叩かれた。
「すみませーん。電算部はこちらですかー?」
 聞きなれた声。
 この声は――西原さんだ!

-9-
Copyright ©芳野 All Rights Reserved 
<< 前のページへ 次のページへ >> ここまでで読み終える