atoiは、stdlib.hをインクルードすれば、利用できます。
しかし正しく利用するには、その関数がどのように作られたものかを理解する必要があります。
以下では、この関数の定義例と利用例を紹介します。
オペレータがコンピュータに入力する場合は文字の並びで入力します。
よって、それを数値として取り扱いたい場合は
、数値として記憶し直さなければなりません。
文字列を数値に変換するには、
各文字をそれぞれ数値に変更し、
それぞれの桁の重みを掛けて、合計する計算になります。
例えば"123"の文字列であれば、'1'、'2'、'3'の文字コードを、
数値の 1、2、3 に変換し、
1 * 100 + 2 * 10 + 3の 計算を行います。
以下のプログラムでは、これを繰り返しで行なっています。この"123"であれば、
val = '1' - '0';
val *= 10;
val += '2' - '0';
val *= 10;
val += '3' - '0';
と、計算します。('0'の引き算は、文字コードを対応する数値に変換しています)
仮引数 a で文字列先頭アドレスを受け取ります。
その文字列の先頭に、
半角スペースやtab や Enterの改行文字の空白文字
並びがある場合、それら無視しする繰り返しの処理します。
(scanfの%dや%fや%sなどにおける空白文字を除く処理は、このようなプログラムになります。)
続いて、符合がある場合の記憶を行なって、
それから、文字列の上位桁より
数字の文字コードと判断できる間だけ数値に変換する繰り返しをします。
最後に符号を付けてその変換した数値を戻り値にします。その関数定義例を次に示します。
#include <stdio.h> int atoi(char * a) { int val = 0; /* 変換した値 */ int sign_flag = 1; /* 正の値であれば1、負なら-1 */ int i = 0; while(a[i] == ' ' || a[i] == '\n' || a[i] == '\t'){/* 先頭にある空白文字を無視 */ i++; } if(a[i] == '-'){/* 符号文字か */ sign_flag = -1; i++; } else if(a[i] == '+'){ i++; } while( a[i] >= '0' && a[i] <= '9'){/* 数字の文字コードである間、変換する*/ val *= 10; val += a[i] - '0'; /* a[i]の文字に対応する数値に変換 */ i++; /* 次の位置の添え字 */ } if(sign_flag == -1){ return -val;/* 負の値 */ } else { return val; } } main() { char a[10]; int n; do { printf("数の文字列入力>" , a ); gets(a);/* 1行入力 */ n = atoi(a); printf("atoi(\"%s\")の戻り値は%dです。\n", a , n ); } while (n != 0); }
atoi関数の確認するためのmainで、戻りが0になるまでの繰り返しを行なっています。
実行例を以下に示します。(空白文字や数字以外を含む入力も確かめています)
数の文字列入力>123 atoi("123")の戻り値は123です。 数の文字列入力>-45 atoi("-45")の戻り値は-45です。 数の文字列入力> +12ABC atoi(" +12ABC")の戻り値は12です。 数の文字列入力>ABC atoi("ABC")の戻り値は0です。
atoiは、ascii to integer (ASCIIコードを整数へ)からの命名された関数です。 同様にascii to floating-point (ASCIIコードを浮動小数点へ)から 命名された atof 関数もあり、実数の値に変換する時に使います。(戻り値はdouble型)
上記 stoiと同じ機能を行なわせる別の定義例を、以下に示します。
ここでは、添え字用変数iを使っていません。ポインタの変数を変更することで、
処理対象の文字コードを変更しています。
■■■■ の記述を正しく直して完成くだささい。
([]の配列演算子を使わずに、*のポインタ演算子を使ってください。ポインタ変更は後置インクリメントを使ってください)
←編集 入力後に クリックください。
このようなポインタの変数を変更する方式は、C言語独特の作り方です。