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

如何不使用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(&current_num);
                *result += current_num;
                current_num = 0;
                in_number = false;
            }
        }
    }
    // 处理字符串末尾的最后一个数字
    if (in_number) {
        ValidateInput(&current_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 16:15:09