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
相关产品推荐
相关产品推荐

