【tip】C语言整数和字符串互转实现

2024-01-10  本文已影响0人  papi_k的小茅屋
// 整数转字符串
char *itoa(int num, char *str, int radix)
{
    char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //索引表
    unsigned unum;
    int i = 0;

    // 获取要转换的整数的绝对值
    if (radix == 10 && num < 0) {
        unum = (unsigned)-num;
        str[i++] = '-';
    } else {
        unum = (unsigned)num;
    }

    // 转换部分,注意转换后是逆序的
    do {
        str[i++] = index[unum % radix]; //取unum的最后一位,并设置为str对应位,指示索引加1
        unum /= radix; //unum去掉最后一位
    } while (unum)

    str[i] = '\0'; //在字符串最后添加'\0'字符,c语言字符串以'\0'结束

    int k; // k用来指示调整顺序的开始位置;
    int j; // j用来指示调整顺序时的交换;
    //将顺序调整过来
    if (str[0] == '-') { //如果是负数,符号不用调整,从符号后面开始调整
        k = 1;
    } else { //不是负数,全部都要调整
        k = 0;
    }

    char temp; //临时变量,交换两个值时用到
    for (j = k; j <= (i - 1) / 2; j++) { //头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1
        temp = str[j]; //头部赋值给临时变量
        str[j] = str[i - 1 + k - j]; //尾部赋值给头部
        str[i - 1 + k - j] = temp;
    }
    return str;
}


// 字符串转整数
long atol(const char *nptr)
{
    int c; /* 当前要转换的字符(一个一个字符转换成数字) */
    long total; /* 当前转换结果 */
    int sign; /* 标志转换结果是否带负号*/

    /*跳过空格,空格不进行转换*/
    while (isspace(int)(unsigned char)*nptr) { // C 库函数 int isspace(int c) 检查所传的字符是否是空白字符
        ++nptr;
    }

    int c = (int)(unsigned char)*nptr++; //获取一个字符准备转换
    sign = c;
    if (c == '-' || c == '+') {
        c = (int)(unsigned char)*nptr++;
    }

    total = 0; //设置转换结果为0
    while (isdigit(c)) { // C 库函数 int isdigit(int c) 检查所传的字符是否是十进制数字字符。十进制数字是:0 1 2 3 4 5 6 7 8 9
        total = 10 * total + (c - '0'); /* 根据ASCII码将字符转换为对应的数字,并且乘10累积到结果 */
        c = (int)(unsigned char)*nptr++; /* 取下一个字符 */
    }

    // 根据符号指示返回是否带负号的结果
    if (sign == '-') {
        return -total;
    } else {
        return total;
    }
}

yo peace!

上一篇下一篇

猜你喜欢

热点阅读