如何不使用strtok实现字符串分割,完成C语言字符串计算器开发
C语言字符串计算器代码问题修复
核心错误点
ValidateInput函数逻辑错误:函数内直接给指针变量x赋值0,仅修改了指针本身的地址,并未修改指针指向的数值,正确写法应该是*x = 0。strcat使用严重错误:strcat要求第二个参数必须是\0结尾的合法C字符串,你传入单个字符的地址&c,会导致函数越界读取后续内存直到碰到\0,引发缓冲区溢出、内存乱访问,这就是单元测试冻结、输出异常的核心原因。- 数字解析逻辑只支持最多2个数字:用布尔变量标记是否碰到分隔符的逻辑,只能拆分前、后两段数字,无法处理3个及以上数字的输入,不符合通用字符串计算器的需求。
- 函数参数未正确使用:
test函数入参的result指针没有被赋值,业务逻辑完全没用上这个输出参数。 isdigit参数存在隐患:isdigit要求入参必须是unsigned char类型或EOF,直接传入char类型如果是负值会触发未定义行为。
修复后完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <stdbool.h> void ValidateInput(int *x) { if (*x >= 1001 && *x <= 1111) { *x = 0; } } int test(char *numbers, int numbers_length, int *result) { if (result == NULL || numbers == NULL) return -1; // 非法入参校验 *result = 0; int current_num = 0; bool in_number = false; // 标记当前是否处于数字段中 for (size_t i = 0; i < numbers_length; i++) { char c = numbers[i]; if (isdigit((unsigned char)c)) { current_num = current_num * 10 + (c - '0'); in_number = true; } else { // 碰到分隔符,处理之前累积的数字 if (in_number) { ValidateInput(¤t_num); *result += current_num; current_num = 0; in_number = false; } } } // 处理字符串末尾的最后一个数字 if (in_number) { ValidateInput(¤t_num); *result += current_num; } printf("计算结果:%d\n", *result); return 0; // 正常返回0 } int main() { int sum = 0; char numbers[] = "100,10abc1005@200"; // 测试多分隔符、范围外数字的场景 int length = strlen(numbers); test(numbers, length, &sum); return 0; }
修复说明
- 去掉了错误的字符数组拼接逻辑,直接在遍历过程中逐位计算当前数字的值,彻底避免内存访问异常
- 支持任意数量的数字、任意长度的非数字分隔符,完全符合需求
- 修复了数值范围判断的赋值逻辑,1001-1111区间的数字会正确置0
- 增加了入参校验,避免空指针崩溃
- 正确使用了输出参数
result存储最终求和结果
内容的提问来源于stack exchange,提问作者user7772779
相关产品推荐
相关产品推荐

