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

C语言多字符串转整数出错:atoi保留旧转换值该如何解决?

问题原因
  • C语言标准中,字符串必须以\0(空终止符)作为结束标记,atoi函数会从传入的字符指针起始位置开始逐字符解析,直到遇到\0才会停止转换。
  • 你定义的day、month数组长度仅为2,刚好能存下2位数字字符,没有多余空间存储\0;year数组长度仅为4,存完4位年份数字后也没有空间放置空终止符。注意strncpy在拷贝长度等于目标可写长度时,不会自动补充空终止符,因此三个字符数组都不是合法的C字符串。
  • 由于局部数组在栈空间通常是连续存储的,atoi解析时会一直读到相邻数组的内容甚至栈上其他随机数据才会碰到\0,最终就出现了多个数值拼接的错误结果。
解决方案

推荐两种成熟的修复方案:

方案1:预留空终止符存储位,手动补结束标记

将数组长度多开1位,专门用来存储\0,拷贝完成后主动在数组末尾补终止符:

// 数组长度+1预留空终止符位置
char day[3], month[3], year[5];

strncpy(day, date, 2);
day[2] = '\0'; // 手动补充字符串结束标记
strncpy(month, &date[3], 2);
month[2] = '\0';
strncpy(year, &date[6], 4);
year[4] = '\0';

int dayInt = atoi(day);
int monthInt = atoi(month);
int yearInt = atoi(year);

方案2:直接用格式化读取函数提取,无需手动拆分

如果输入的日期是固定分隔符的格式(比如dd-mm-yyyy、dd/mm/yyyy),可以直接用sscanf一次性提取三个整数,代码更简洁且不容易出错:

int dayInt, monthInt, yearInt;
// 分隔符和输入日期格式保持一致即可,比如斜杠就改为"%d/%d/%d"
sscanf(date, "%d-%d-%d", &dayInt, &monthInt, &yearInt);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:39:03