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言語独特の作り方です。