c语言数字转字符串

对下面代码的一些细节,解释下为什么那么做。

1.

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

这个buf的作用是缓存中间结果,长度没有写死。好处是不同的平台上这段代码都可以执行。

2.

if (base < 2 || base > 36)

该判断检查用户传入的进制数是否合法。base < 2 主要过滤负数和0和1。base > 36的意义是在超过10进制的数里,是用字母a表示10的。以此类推z可以表示36。在只使用ascii字符表示大于10的数时,最大的表示值是36,超过这个值就不能表示。

3.

uval = -val;

这各写法可以避免一个潜在的坑。当val为int值为INT_MIN时 -val会溢出。表象为-val 的值还是INT_MIN,还是个负数

4.至于为什么用一个无符号整数与一个>0的int进行整除与取余

uval % base
uval /= base

因为c语言的标准里没有规定x / y当有一个值为负数时,结果该向x坐标轴的左侧靠近(向0取整) 还是向侧靠近(负无穷)

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

-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;
}
时间: 2024-10-28 11:12:18

c语言数字转字符串的相关文章

C语言中将数字转换为字符串的方法(转自c语言中文网)

C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <stdio. h># include <stdlib. h> void main (void) { int num = 100; char str[25]; itoa(num, str, 10); printf("The number 'num' is %d and the string 'str' is %

C语言中将数字转换为字符串的方法

C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <stdio. h># include <stdlib. h>void main (void);void main (void){    int num = 100;    char str[25];    itoa(num, str, 10);    printf("The number 'num' is %

C语言把数字转换为字符串的函数

博主原文 C语言itoa()函数和atoi()函数详解(整数转字符C实现) C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. 1.int/float to string/array:C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明.● itoa():将整型值转换为字符串.● ltoa():将长整型值转换为字符串.● ultoa():将无符号长整型值转换为字符串.● gcvt():将浮点型

R语言格式化数字和字符串format函数

数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justify = c("left", "right", "centre", "none")) 以下是所使用的参数的说明: x - 为向量输入 digits - 是显示总位数 nsmall - 是最小位数的小数点右边 scientific 

【语言对比】字符串

字符串是各类语言中一种非常重要的数据结构,事实上大部分的代码都是基于字符串的操作,各个语言对字符串的处理方式,也是我们评价各个语言的一个重要方面. 因为C++库中并没有提供字符串这个数据类型,所以我们以STL中提供的string来进行对比.这里不选择char*进行对比,是因为char*在功能上和其它两种语言差距实在是太大了,基本上不具有对比性,之前一直使用的都是STL,所以这里直接选用STL来对比了. JAVA中选用String及其周边类,它们会作为一个整体进行对比: 而python中的stri

C语言---整型字符串转换

C语言提供了几个标准库函数,能够将随意类型(整型.长整型.浮点型等)的数字转换为字符串.下面是用itoa()函数将整数转 换为字符串的一个样例: # include <stdio.h>    # include <stdlib.h> void main (void)    {    int num = 100;    char str[25];    itoa(num, str, 10);    printf("The number ’num’ is %d and the

R语言学习(5)-字符串和因子

字符串和因子 1.字符串 创建字符串 > c("HELLO","WORLD") [1] "HELLO" "WORLD" 使用paste函数连接字符串 > paste(c("hello","hi"),"world") [1] "hello world" "hi world" > paste(c("hel

【美妙的Python之四】标准变量类型-数字与字符串

美妙的Python之Python标准变量类型 简而言之: Python 是能你无限惊喜的语言,与众不同.         1.数字:        Python支持四种数字变量类型: int(有符号整形) long(长整形) float(浮点型) complex(复数)        数字变量用于存储数值,数字对象是不可改变对象,因此改变数字变量的值会分配一个新的对象.       如下示意图:          变量相当于便签,a=3则相当于将a便签贴到值为3的数字对象上,这样便可以通过便签a

python语言学习8——字符串和编码

Unicode编码 计算机只能处理数字,如果要处理文本,就必须把文本转化为数字才能处理 有许多编码标准,但是不同的编码标准有时候会混乱,所以Unicode应运而生 Unicode把所有语言统一到一套编码里,这样就不会再有乱码问题 ASCII编码和Unicode编码的区别: ASCII编码是1个字节,而Unicode编码通常是2个字节. 字母A用ASCII编码是十进制的65,二进制的01000001: 字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的: