You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

atoi函数返回错误数值问题及相关代码求助

排查atoi返回错误数值的问题

嘿,我来帮你搞定这个atoi返回错误值的问题,咱们拆解一下代码里的几个关键问题:

1. 字符数组长度不够,导致内存溢出

你定义的char num[2];存不下两位数的字符串——C语言里字符串必须以'\0'(空字符)结尾,所以要存两位数字,数组长度至少得是3(2个数字字符 + 1个结束符)。长度不够的话,输入的内容会“跑”到相邻的内存区域,破坏aux1、aux2这些变量的值,后续的atoi计算自然会出错。

2. scanf的参数写法错误

scanf("%s", &num);这里不需要加&,因为数组名num本身就会自动退化为指向数组第一个元素的指针,直接写scanf("%s", num);才是正确的写法。虽然加&有时候能侥幸运行,但不符合C语言的规范,也可能埋下隐患。

3. 单个字符转整数用错了atoi

你想用atoi(&num[1])获取第二个数字,但atoi的要求是传入以'\0'结尾的完整字符串。num[1]只是单个字符,它后面没有结束符,atoi会一直读取内存直到找到'\0',这就会读到一堆垃圾数据,返回错误的数值。

其实单个字符转整数根本不用atoi,直接用字符的ASCII码差就行:比如num[1] - '0',因为数字字符的ASCII码是连续的,'0'到'9'依次递增,减完就能得到对应的整数。

修正后的代码示例

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

int main(void) { // 注意:C标准要求main函数的返回类型是int,不是void
    // 数组长度设为3,容纳两位数字+结束符
    char num[3];
    int aux1, aux2, aux3;

    printf("Escreva um numero de 0 a 99: ");
    // 限制输入长度为2,彻底避免溢出风险
    scanf("%2s", num);
    printf("\nEste numero por extenso eh: ");

    aux1 = atoi(num); // 这里没问题,num是合法的字符串
    aux2 = num[0] - '0'; // 第一个数字转整数
    aux3 = num[1] - '0'; // 第二个数字转整数

    // 后续的转换逻辑可以继续写啦
    // ...

    return 0; // main函数需要返回一个整数值
}

另外,我还加了%2s来限制scanf的输入长度,防止用户输入超过两位的内容导致溢出,这样代码会更安全。

内容的提问来源于stack exchange,提问作者Caio Schnepper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:45:08