调用strcat出现段错误,请求排查C语言RPN转换代码问题
排查strcat导致的段错误及代码修正
我来帮你理清这个段错误的根源,还有代码里的几个关键问题,咱们一步步拆解:
1. 直接触发段错误的原因:strcat参数类型不匹配
strcat的函数原型是char *strcat(char *dest, const char *src),第二个参数要求是字符串指针(指向以\0结尾的字符数组)。但你代码里写的strcat(str, text[i])、strcat(str, st[j]),传的都是单个char(比如字符'a')——这会被编译器当成一个内存地址,指向完全非法的内存区域,直接触发段错误。
要把单个字符拼接到字符串里,你有两种简单的解决方式:
- 方式一:直接操作字符串末尾,手动加结束符:
int str_len = strlen(str); str[str_len] = text[i]; str[str_len + 1] = '\0'; - 方式二:把单个字符包装成临时的1字节字符串再用strcat:
char temp[2] = {text[i], '\0'}; // 第二个元素必须是结束符 strcat(str, temp);
你代码里所有用strcat拼接单个字符的地方都犯了这个错误,这是段错误的核心原因。
2. 字符与字符串的比较错误
代码里有几处把字符和字符串字面量用==比较的错误:
if(text[i]=="("):"("是字符串指针,text[i]是char类型,两者比较的是内存地址和字符ASCII值,永远不会相等,应该改成if(text[i] == '(')(单引号表示单个字符)。if(st[j]!="null"):这里逻辑完全错误,"null"是字符串,st[j]是char,你想表达的是“栈不为空”,应该改成if(j > 0)(j是栈的元素计数)。
3. 栈操作的逻辑错误
当遇到)弹出栈顶元素时,你写的st[j]是错误的——因为之前push元素时你先赋值给st[j]再j++,所以栈顶元素的下标是j-1,不是j。另外最后遍历栈中剩余元素时,循环变量是k,你却用了st[j],应该改成st[k]。
4. 其他小问题
- 打印字符串应该用
%s格式符,你代码里printf("%c\n",str);是错的,会打印字符串首字符的ASCII值对应的乱码。 static int j=0;会导致j的值在函数调用后不会重置,如果多次调用rpn函数会出问题,改成局部变量更安全。
修正后的完整代码
#include <stdio.h> #include <string.h> void rpn(char* text) { int j = 0; // 改为局部变量,避免static的残留问题 char st[10]; char str[80] = ""; int i; int n = strlen(text); for(i = 0; i < n; i++) { printf("enter\n"); if(text[i] == '(') { continue; } else if(text[i] == '+' || text[i] == '*' || text[i] == '-' || text[i] == '/' || text[i] == '^') { st[j] = text[i]; printf("%c\n", st[j]); j++; } else if(text[i] == ')') { if(j > 0) { // 先判断栈非空,避免越界 char temp[2] = {st[j-1], '\0'}; strcat(str, temp); printf("%s\n", str); j--; } } else { printf("yay\n"); char temp[2] = {text[i], '\0'}; strcat(str, temp); printf("%s\n", str); } } // 处理栈中剩余的运算符 for(int k = j-1; k >= 0; k--) { char temp[2] = {st[k], '\0'}; strcat(str, temp); } printf("最终逆波兰表达式: %s\n", str); } int main() { printf("find ex\n"); char texts[] = "((a+t)*((b+(a+c))^(c+d)))"; rpn(texts); return 0; }
运行这段代码就不会再出现段错误,能正确生成逆波兰表达式啦。
内容的提问来源于stack exchange,提问作者user10598529
相关产品推荐
相关产品推荐

