atoiの使い方

C言語にはatoiという、「文字列」を「数字」に直してくれる関数が提供されています。詳しくはwikipedia:atoiを参照。

「文字列」を変換するので、当然引数に渡すのはcharポインタです。
例えば、"123abc"という文字列を渡した場合、123が返ってくることからも分かるように、文字列に順次アクセスして、この結果を得ています。
さて問題です。以下のようなソースを記述した場合、どうなるでしょうか?

/* C99 */
char ch;
// 0から9の数字文字が入力されることを想定
ch = (char)fgetc(stdin);
int num = atoi(&ch);

もちろん、数字文字が入力された場合、簡単に領域外参照を起こします。場合によっては予期しない値を返すばかりか、セグメンテーションフォルトでプログラムが終了することさえあるかも知れません。
次のようなものなら、まあメモリアクセスに関する問題は無いと思います。

/* C99 */
char ch[64];
fgets(ch, 64, stdin);
int num = atoi(ch);

結論

  • atoiを使うときにchar型(すなわち文字の)ポインタを投げて使うな。
  • 変換したいなら、(ch - '0')でいいじゃない。
  • atoiを使うときは、引数に文字列を渡せ。