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

