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

使用strtok解析C语言字符串并存入数组时的异常问题求助

问题分析与解决建议

这个问题我太熟悉了!你看到的那个“大整数”其实是未初始化的局部数组残留的垃圾值,咱们一步步拆解解决:

问题根源

你定义的int array[2]如果是局部变量(比如在函数内部定义),它会被分配在栈内存中,而栈内存的默认初始值是随机的垃圾数据。当解析"10"这种单个元素的字符串时,循环只会给array[0]赋值为10,array[1]根本没被修改过,所以它就保留了原来的垃圾值,也就是你看到的奇怪大整数。另外还要注意:如果变量n没初始化,它的初始值也是随机的,可能直接导致数组越界,这个小细节也别漏了!

两种靠谱的解决办法

1. 先初始化数组

给数组赋初始值,把未使用的元素设成你期望的默认值(比如0):

int array[2] = {0}; // 初始化所有元素为0
int n = 0; // 务必初始化n!
char *p = strtok(argv[1], ",");
while (p != NULL) {
    array[n++] = atoi(p);
    p = strtok(NULL, ",");
}

这样即使只解析到一个元素,第二个元素也是0,不会出现莫名的大整数。

2. 限制赋值次数(更安全)

因为你的数组只有2个元素,最好在循环里加个判断,避免万一输入了超过2个元素的字符串(比如"10,5,7")导致数组越界写内存,引发未知bug:

int array[2] = {0};
int n = 0;
char *p = strtok(argv[1], ",");
while (p != NULL && n < 2) { // 新增n<2的判断,防止越界
    array[n++] = atoi(p);
    p = strtok(NULL, ",");
}

这样最多只会给前2个元素赋值,既解决了垃圾值问题,又提升了代码的健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:06:27