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

C语言使用strtok按空格拆分用户输入运算表达式存储异常问题

问题根本原因

你代码的核心问题出在存储逻辑上:你定义的equation是单字符数组,每个元素只能存储1个字符,而赋值时用的*temp是取temp指向的字符串的首字符,所以拆分得到的多字符数字"999"只会存入第一个字符'9',和你预期的存储完整token不符。

修正方案

你需要存储拆分得到的每个完整token(可能是多字符数字、单字符运算符),所以应该把equation定义为字符指针数组,直接存储strtok返回的每个token的地址即可(strtok拆分时会自动在每个token末尾插入\0作为字符串结束符,无需额外处理)。

修正后的示例代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    char input[100];
    fgets(input, 100, stdin);
    // 预处理:去掉fgets读取的末尾换行符,避免影响后续处理
    input[strcspn(input, "\n")] = '\0';

    char* equation[100] = {NULL}; // 指针数组,每个元素存一个token的地址
    int order = 0;
    char *temp = strtok(input, " ");

    while(temp != NULL && order < 99) // 加边界判断避免数组越界
    {
        equation[order] = temp; // 直接存储token地址,无需取首字符
        printf("Index: %d | %s\n", order++, temp);
        temp = strtok(NULL, " ");
    }

    // 校验输出
    for(int i = 0; i < order; i++)
    {
        printf("Index: %d | Element: %s\n", i, equation[i]);
        // 后续转整数直接调用atoi(equation[i])即可,运算符可通过equation[i][0]判断
    }
    return 0;
}

补充说明

如果你的需求需要保留原输入字符串不被strtok修改,可以改用二维字符数组存储每个token的拷贝,使用strcpy把temp指向的内容拷贝到对应数组位置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:09:04