【C言語】itoaを自作するとitoa(INT_MIN)で大抵バグるのでsprintfを使え

自作itoa(INT_MIN)で バグる

自作itoa(INT_MIN)でバグる

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>
#include <string.h>

// itoa 関数の実装
char* itoa(int num) {
    // 変数の初期化
    static char result[256]; // 最大 12 桁の整数を扱えるように
    int index = 0;
    bool is_negative = false;

    // 負の数を扱う
    if (num < 0) {
        is_negative = true;
        num = -num;
    }

    // 各桁を文字に変換して結果に追加
    while (num > 0) {
        int digit = num % 10;
        result[index++] = '0' + digit;
        num /= 10;
    }

    // 負の符号を追加
    if (is_negative) {
        result[index++] = '-';
    }

    // 文字列を反転
    for (int i = 0; i < index / 2; ++i) {
        char temp = result[i];
        result[i] = result[index - i - 1];
        result[index - i - 1] = temp;
    }

    // 文字列の終端を設定
    result[index] = '\0';

    return result;
}
int     main(void){
    //INT_MAXは動く
    int max = INT_MAX;
    printf("%d\n%s\n",max,itoa(max));

    //INT_MINでバグる   
    int min = INT_MIN;
    printf("%d\n%s\n",min,itoa(min));
}

生成AIにitoa関数を作ってもらいました。


➡暴走結果の例

./a.out
2147483647
2147483647
-2147483648
-

自作 itoa(INT_MIN)で暴走しました。
ネットで紹介されている
自作itoaもほぼ全滅です。


■修正例(sprintfを使う)

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

int     main(void){
    char    ascii[256];
     
    //INT_MAXは動く
    int max = INT_MAX ;
    sprintf(ascii,"%d",max);
    printf("%d\n%s\n",max,ascii);

    //INT_MINも動く
    int min = INT_MIN ;
    sprintf(ascii,"%d",min);
    printf("%d\n%s\n",min,ascii);
}

itoa関数を自作しないで
標準関数のsprintfを使いました。


➡期待する結果が得られる

./a.out
2147483647
2147483647
-2147483648
-2147483648

つまり、
itoa関数を自作しないで
sprintfを使えという話でした。

参考:

C-FAQ 13.1