文字列を数値に変換 atoi

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型)

引数のポインタ変数を変更する atoi 関数定義例

上記 stoiと同じ機能を行なわせる別の定義例を、以下に示します。
ここでは、添え字用変数iを使っていません。ポインタの変数を変更することで、 処理対象の文字コードを変更しています。
■■■■ の記述を正しく直して完成くだささい。
([]の配列演算子を使わずに、*のポインタ演算子を使ってください。ポインタ変更は後置インクリメントを使ってください)

←編集 入力後に クリックください。

このようなポインタの変数を変更する方式は、C言語独特の作り方です。