c語言數字轉字符串

對下面代碼的一些細節,解釋下爲何那麼作。緩存

1. code

char buf[sizeof(int) * 8 + 1] = "";

這個buf的做用是緩存中間結果,長度沒有寫死。好處是不一樣的平臺上這段代碼均可以執行。ci

2.string

if (base < 2 || base > 36)

該判斷檢查用戶傳入的進制數是否合法。base < 2 主要過濾負數和0和1。base > 36的意義是在超過10進制的數裏,是用字母a表示10的。以此類推z能夠表示36。在只使用ascii字符表示大於10的數時,最大的表示值是36,超過這個值就不能表示。it

3.io

uval = -val;

這各寫法能夠避免一個潛在的坑。當val爲int值爲INT_MIN時 -val會溢出。表象爲-val 的值仍是INT_MIN,仍是個負數class

4.至於爲何用一個無符號整數與一個>0的int進行整除與取餘im

uval % base
uval /= base

由於c語言的標準裏沒有規定x / y當有一個值爲負數時,結果該向x座標軸的左側靠近(向0取整) 仍是向側靠近(負無窮)static

它只規定了 (x / y) * y + (x % y) = x tab

-14 /5 的結果能夠是 -2 或者 -3

至爲正數爲啥沒有兩個結果。本人只是用了幾個值進行了驗證。。


好了貼代碼:

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

char *int2str(int val, char *str, int base) {
    static char tab[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char buf[sizeof(int) * 8 + 1 + 1] = "";
    char *p = buf;
    char *p2 = str;
    unsigned uval = val;

    //檢查base的範圍
    if (base < 2 || base > 36) {
        *str = '\0';
        return str;
    }

    //負數
    uval = val;
    if (val < 0 && base == 10) {
        uval = -val;
    }

    do {
        *p++ = tab[uval % base];
        //printf("%d:%d:%d\n", uval, uval % base, base);
    } while (uval /= base);

    if (val < 0 && base == 10) {
        *p++ = '-';
    }

    p--;
    while (p >= buf && (*p2++ = *p) != '\0')
        p--;
    *p2 = '\0';

    return str;
}

void tst_max_2() {
    char buf_int2str[34] = "";
    printf("max 2#%s\n", int2str(CHAR_MAX, buf_int2str, 2));

    printf("max 2#%s\n", int2str(SHRT_MAX, buf_int2str, 2));

    printf("max 2#%s\n", int2str(INT_MAX, buf_int2str, 2));
}

void tst_max_8() {
    char buf_int2str[34] = "";
    printf("max 8#%s\n", int2str(CHAR_MAX, buf_int2str, 8));

    printf("max 8#%s\n", int2str(SHRT_MAX, buf_int2str, 8));

    printf("max 8#%s\n", int2str(INT_MAX, buf_int2str, 8));

}

void tst_max_10() {
    char buf_int2str[34] = "";
    char buf_snprintf[34] = "";

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%d", CHAR_MAX);
    assert(!strcmp(int2str(CHAR_MAX, buf_int2str, 10), buf_snprintf));

    printf("max 10#%d:%s:%s\n", CHAR_MAX, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%d", SHRT_MAX);
    assert(!strcmp(int2str(SHRT_MAX, buf_int2str, 10), buf_snprintf));
    printf("max 10#%d:%s:%s\n", SHRT_MAX, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%d", INT_MAX);
    assert(!strcmp(int2str(INT_MAX, buf_int2str, 10), buf_snprintf));
    printf("max 10#%d:%s:%s\n", INT_MAX, buf_int2str, buf_snprintf);
}

void tst_max_16() {
    char buf_int2str[34] = "";
    char buf_snprintf[34] = "";
    snprintf(buf_snprintf, sizeof(buf_snprintf), "%x", CHAR_MAX);
    assert(!strcmp(int2str(CHAR_MAX, buf_int2str, 16), buf_snprintf));
    printf("max 16#%d:%s:%s\n", CHAR_MAX, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%x", SHRT_MAX);
    assert(!strcmp(int2str(SHRT_MAX, buf_int2str, 16), buf_snprintf));
    printf("max 16#%d:%s:%s\n", SHRT_MAX, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%x", INT_MAX);
    assert(!strcmp(int2str(INT_MAX, buf_int2str, 16), buf_snprintf));
    printf("max 16#%d:%s:%s\n", INT_MAX, buf_int2str, buf_snprintf);
}

void tst_min_2() {
    char buf_int2str[34] = "";
    printf("min 2#%s\n", int2str(CHAR_MIN, buf_int2str, 2));

    printf("min 2#%s\n", int2str(SHRT_MIN, buf_int2str, 2));

    printf("min 2#%s\n", int2str(INT_MIN, buf_int2str, 2));
}

void tst_min_8() {
    char buf_int2str[34] = "";
    printf("min 8#%s\n", int2str(CHAR_MIN, buf_int2str, 8));

    printf("min 8#%s\n", int2str(SHRT_MIN, buf_int2str, 8));

    printf("min 8#%s\n", int2str(INT_MIN, buf_int2str, 8));
}

void tst_min_10() {
    char buf_int2str[34] = "";
    char buf_snprintf[34] = "";
    snprintf(buf_snprintf, sizeof(buf_snprintf), "%d", CHAR_MIN);
    assert(!strcmp(int2str(CHAR_MIN, buf_int2str, 10), buf_snprintf));
    printf("min 10#%d:%s:%s\n", CHAR_MIN, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%d", SHRT_MIN);
    assert(!strcmp(int2str(SHRT_MIN, buf_int2str, 10), buf_snprintf));
    printf("min 10#%d:%s:%s\n", SHRT_MIN, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%d", INT_MIN);
    assert(!strcmp(int2str(INT_MIN, buf_int2str, 10), buf_snprintf));
    printf("min 10#%d:%s:%s\n", INT_MIN, buf_int2str, buf_snprintf);
}

void tst_min_16() {
    char buf_int2str[34] = "";
    char buf_snprintf[34] = "";

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%x", CHAR_MIN);
    assert(!strcmp(int2str(CHAR_MIN, buf_int2str, 16), buf_snprintf));
    printf("min 16#%d:%s:%s\n", CHAR_MIN, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%x", SHRT_MIN);
    assert(!strcmp(int2str(SHRT_MIN, buf_int2str, 16), buf_snprintf));
    printf("min 16#%d:%s:%s\n", SHRT_MIN, buf_int2str, buf_snprintf);

    snprintf(buf_snprintf, sizeof(buf_snprintf), "%x", INT_MIN);
    assert(!strcmp(int2str(INT_MIN, buf_int2str, 16), buf_snprintf));
    printf("min 16#%d:%s:%s\n", INT_MIN, buf_int2str, buf_snprintf);
}

void tst_0() {
    char buf_int2str[34] = "";
    int2str(0, buf_int2str, 16);
    printf("0 #%s\n", buf_int2str);
}

int main() {
    tst_max_2();
    tst_max_8();
    tst_max_10();
    tst_max_16();

    tst_min_2();
    tst_min_8();
    tst_min_10();
    tst_min_16();

    tst_0();
#if 0
    int val = INT_MIN;
    printf("##%d:%d:%u\n", val, -val, -val);
    //printf("%d:%d:%u\n", INT_MIN, -INT_MIN, -INT_MIN);
#endif
    return 0;
}
相關文章
相關標籤/搜索