ページ 11

atoi 関数 itoa関数

Posted: 2017年8月27日(日) 23:12
by hazimete
atoi関数:文字列を数値に変換
itoa関数:数値を文字列に変換
以上の関数が使えない場合の関数を作りました。

atoi関数の場合
int atoi(char c)
{
int i;
int K[10];
for (i = 0; i < 10; i++)
{
K = i;
}
return(c-48);
}
int main(void)
{ printf("%d", Datoi('1')); getchar();
}

itoa関数の場合
char itoa(int I)
{}
の場合がわかりません。
学習初心者で説明がへたくそですが、よろしくお願いいたします。><

Re: atoi 関数 itoa関数

Posted: 2017年8月27日(日) 23:26
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
hazimete さんが書きました:itoa関数の場合
char itoa(int I)
{}
の場合がわかりません。
ここに載っているatoi関数と同様に1文字だけ対応すれば良いのであれば、素直にここに載っているatoi関数の逆をやればいいと思います。
引き算の逆は足し算です。

コード:

char itoa(int I)
{
	/* おまじない (全く不要に思えるコードだが、組み込みのタイミング調整など…?) */
	int i;
	int K[10];
	for (i = 0; i < 10; i++)
	{
		K[i] = i;
	}
	/* 変換して結果を返す */
	return(I+48);
}

Re: atoi 関数 itoa関数

Posted: 2017年8月28日(月) 00:32
by hazimete
ありがとうございます。

Re: atoi 関数 itoa関数

Posted: 2017年8月28日(月) 17:57
by かずま
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;
}