c - 我在使用 strcat 时遇到分段错误。请告诉我出了什么问题
问题描述
void rpn(char*text)
{static int j=0;
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]==')')
{
strcat(str,st[j]);
printf("%c\n",str);
j--;
}
else
{
printf("yay\n");
strcat(str,text[i]);
//strcat(str,'\0');
printf("%c\n",str);
}
}
if(st[j]!="null")
{int k;
for(k=j;k>=0;k--)
{
strcat(str,st[j]);
}
}
}
int main()
{
printf("find ex\n");
char texts[]="((a+t)*((b+(a+c))^(c+d)))";
rpn(texts);
return 0;
}
输出: find ex
enter
yay
Segmentation fault 它打印 yay 但是当它必须将字母“a”从 text[i] 复制到 str 时,它显示分段错误。我不明白为什么我已经尝试了所有分配额外空间等似乎没有工作。
解决方案
你的代码有几个问题
静态int j=0;
为什么j是静态的,而它在st中用作非静态的索引
如果(文本[i]=="(")
无效,将字符与字符串进行比较,行为未定义
strcat(str,st[j]);
无效,第二个参数是字符而不是字符串
printf("%c\n",str);
无效,格式等待一个int(作为一个字符的代码来打印它)但参数是一个字符串
strcat(str,文本[i]);
无效,第二个参数是字符而不是字符串
if(st[j]!="null")
无效,你比较一个字符和一个字符串,行为未定义
strcat(str,st[j]);
无效,第二个参数是一个字符而不是一个字符串
另请注意,在前面的问题中,存在避免通过无效索引读取/写入数组的保护(对于两个数组来说太大,或者如果表达式太糊 ')'对st来说也是负数)
可能st必须是一个数组char*
而不是一个char数组(改变它的类型不足以使代码正确)
看来您想解析表达式,但是您期望得到什么结果?
推荐阅读
- flutter - Flutter 集成测试:模拟应用程序类值
- javascript - 使用 reduxjs/toolkit 向 createAction 函数添加有效负载
- sharepoint - 在 Microsoft Graph API 中按文件类型或名称过滤
- excel - SQL中等效的Excel合并单元格
- python - Python列表索引中的递归排序超出范围
- ios - 将 SwiftUI View 解散回 UIKit ViewController
- python - 声音播放时如何修复opencv视频冻结几秒钟?
- c# - 如何在运行时更改我的 SQLite 连接字符串?
- c# - 对 UserManager 进行额外的异步调用
分页后 - python - PyTouchBar:没有名为 Foundation 的模块