第24章

第24章 scanf関数は使っちゃダメ!

22章で言った、3つの間違い3つ目。 それは、scanf関数を使うことです。
間違ってはいけませんよ、使い方が悪いとか、呼ぶ場所がまずいとか、 そんなことではありません

使うこと自体が間違っているのです。

(私のこのページもそうですが)ほとんどのC言語解説書には、 出力用の関数として、printf、そして入力用の関数として、scanfが まず最初に紹介されるものです。

これは説明する側がちょっと楽なのでこうしているだけで、 実際にプログラムを組む時には、 printf関数は使用しますが、scanf関数なんて絶対使いません

ベテランのCプログラマーは、
「scanf? そういやあったなそんな関数」
というような具合でしょうか。

ですのでこれから、scanf関数仕様禁止令を発令します。 使っちゃダメです。

じゃー、どうやってキーボードから入力するんだよ〜?

それは今回説明する、gets関数です。 この関数は
1行分の入力をGETする関数です。
使い方はこんな感じ。

char str[80];
gets(str);

これで1行分の文字列が、変数 str に格納されます。 簡単でしょ?
ここで str の配列が80になっていますが、これは 1行に80文字以上入力されないだろうという考えのもとで決めている数字です。 もちろん、80文字を超える入力に対してはおかしなことになってしまいますので、 注意しましょう。

余談ですが、パソコンを触ってると、パスワードを入力することが良くあると思います。 セキュリティー関係のソフトを作る時に、上記のような方法でパスワード入力を受け付けると、 大変なことになります。 上の例で言うと、もし80文字以上入力された場合、80文字目以降に入力された文字が、 メモリー上に残ってしまい、やる人がやれば、パスワードロックぐらい簡単に外せるそうです。 昔は、クラッカーの手口で一番多かったのがこの方法だそうです。

ところが、このgets関数だけではまだダメです。 どうしてダメなのかというと、gets関数では 文字列としてしか取れないからです。

つまり、"871"と入力したとすると、"八百七十一"ではなく、 これは単なる文字列"八七一"ですので以下のようにはできません。

char buf1[80], buf2[80];
int  kekka;

gets( buf1 ); // 100と入力
gets( buf2 ); // 200と入力

kekka = buf1 + buf2; // できない
printf("合計 --> %d", kekka); // 300とはならない

そのため、文字列 → 数字 に変換してやる必要があります。 これをしてくれる関数がsscanf関数です。
やっぱり scanf 関数を使うんやんか〜
いえいえ、"scanf"ではなく"sscanf"です。 sが一つ多いのに注意してください。

この関数は何をしてくれる関数かというと、文字列を色んな型(int とか float)に変換してくれる関数です。 今回ので言うと、"八七一"を"八百七十一"にしてくれます。 使い方は以下のようにします。

char str="871"; //初期化だよ〜
int  i;
sscanf( str, "%d", &i ); // &iを渡すことに注意

これで、にっくき(笑)scanf関数を使わなくても、 できるようになりました。では、一例を示しましょう。

結果がこのようになりますが、まー、今回は、"gets""sscanf" の使い方がわかればOKです。

ところで、文字列と数値って、違いわかります?
今まで、何回か出てきていると思いますが、
なんだかよくわからんと思っている人もいるかもしれませんね。

そのうち、実際にはデータがどのように格納されているかを図を交えながら説明しようと思います。
#毎度のことながらいつになるかは「?」

C言語のメニューに戻る


TOPに戻る