2013/02/11

C言語 コマンドプロンプトから数値入力 atoi, atof

fgets

C言語でコマンドプロンプトから数値を入力する方法はいくつかあるのだが、ここでは fgets を使って文字列として読み込み、数値に変換する方法を試してみる。fgets 以外にも scanf を使った方法があるが、予期せぬ入力に対応しきれないため、なるべく扱わない方がよいらしい。

atoi, atof

文字列を数値に変換する方法もいくつかるが、ここでは整数に変換する atoi と、小数に変換する atof を扱う。これらを利用するためには、ヘッダファイルの <stdlib.h> をインクルードする必要がある。

整数の入力 fgetsとatoi

コマンドプロンプトから入力した数値(文字列)をintに変換する例。分かりやすく、入力した文字列も表示するようにしてみた。
#include 
#include 
int main(void) {
  char str[32];
  int num;

  printf("整数を入力してください。\n");
  /* 整数入力 */
  fgets(str,31,stdin);
  /* charをintへ変換 */
  num = atoi(str);
  printf("入力された整数 int: %d\n", num);
  printf("入力された文字列: %s\n", str);
  return 0;
}
intに入るギリギリの大きさの数値を入れてみる。問題なく変換されているのが分かる。
整数を入力してください。
2147483647
入力された整数 int: 2147483647
入力された文字列: 2147483647

次にintに入りきらない大きさの数値 2147483648 を入れてみると、intに変換された後は違った数値になっているのが分かる。実際に使用する場合は、なんらかの対策が必要となる。
整数を入力してください。
2147483648
入力された整数 int: -2147483648
入力された文字列: 2147483648

次に予期せぬ文字列が入った場合どうなるかを試してみる。123abc456def789 という文字列を入れてみると、はじめの123だけを変換して、a以降の文字列は無視された。
整数を入力してください。
123abc456def789
入力された整数 int: 123
入力された文字列: 123abc456def789

次に入力された文字列の頭が数字でない場合の例。結果的に 0 と変換される。
整数を入力してください。
abc123def456
入力された整数 int: 0
入力された文字列: abc123def456



少数の入力 fgetsとatoi

同じように小数の入力サンプルも作ってみた。
#include 
#include 
int main(void) {
  char str[32];
  double num;

  printf("小数を入力してください。\n");
  /* 小数入力 */
  fgets(str,31,stdin);
  /* charをdoubleへ変換 */
  num = atof(str);
  printf("入力された小数 double:\t%20.21f\n", num);
  printf("入力された文字列:\t%s\n", str);
  return 0;
}
double の範囲で表示される。
小数を入力してください。
0.12345678901234567890123456789
入力された小数 double:  0.123456789012345680000
入力された文字列:       0.1234567890123456789012345678


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら