首页 > 解决方案 > 我在使用 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 时,它显示分段错误。我不明白为什么我已经尝试了所有分配额外空间等似乎没有工作。

标签: c

解决方案


你的代码有几个问题

静态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数组(改变它的类型不足以使代码正确)


看来您想解析表达式,但是您期望得到什么结果?


推荐阅读