hazimete さんが書きました:atoi関数:文字列を数値に変換
itoa関数:数値を文字列に変換
以上の関数が使えない場合の関数を作りました。
atoi関数の場合
int atoi(char c)
c は char です。
これは「文字」であって「文字列」ではありません。
"-365" という文字列は、-365 という int の値に
変換しなければなりません。
itoa は標準関数ではありませんが、atoi と itoa の
プロトタイプ宣言は、Wikipedia によると、
int atoi(const char *nptr);
char *itoa(int value, char *str, int radix);
解決になってしまったので、もう手遅れかもしれませんが、
ちょっとインチキな解答です。
コード:
#include <stdio.h>
#include <stdlib.h>
int my_atoi(const char *str)
{
return strtol(str, NULL, 10);
}
char *my_itoa(int val, char *str, int radix)
{
char buf[33], *p = buf, *q = str;
unsigned u = radix == 10 && val < 0 ? *q++ = '-', -val : val;
do {
*p++ = "0123456789abcdefghijklmnopqrstuvwxyz"[u % radix];
} while (u /= radix);
do *q++ = *--p; while (p > buf);
*q = 0;
return str;
}
int main(void)
{
char *str = "-365";
int i = my_atoi(str);
printf("%d\n", i);
char buf[33];
my_itoa(2017, buf, 10);
puts(buf);
return 0;
}
str が十分な大きさの char配列を指していない場合や
radix が 2~36 の範囲にない場合は未定義動作です。
再帰呼出し版の itoa
コード:
char *utoa(unsigned val, char *str, int radix)
{
char *p = val < radix ? str : utoa(val / radix, str, radix);
*p = "0123456789abcdefghijklmnopqrstuvwxyz"[val % radix];
return p + 1;
}
char *my_itoa(int val, char *str, int radix)
{
int neg = radix == 10 && val < 0;
*utoa(neg ? *str = '-', -val : val, str + neg, radix) = 0;
return str;
}