我正在尝试将字符串附加到C中的字符串,但它在我正在使用的函数中不断抛出EXC_BAD_ACCESS代码2错误
void append(char s[], char c)
{
char str[strlen(s)+1];
strcpy (str,s);
char x[2];
x[0]=c;x[1]='\0';
strcat(s, x);
}
调用函数,如您所见,它用于从中缀方程中创建后缀方程
const char * postFix(char x[]){
PtrToNode P = malloc(sizeof(struct Node));
P->Next=NULL;
char* m="";
char open='(',close=')';
for (int i=0;i<strlen(x);i++){
if (x[i]!='+'&&x[i]!='-'&&x[i]!='*'&&x[i]!='/'&&x[i]!='%'&&x[i]!='('&&x[i]!=')'){
if (x[i+1]!='+'&&x[i+1]!='-'&&x[i+1]!='*'&&x[i+1]!='/'&&x[i+1]!='%'&&x[i+1]!='('&&x[i+1]!=')'){
append(m, open);
append(m, x[i]);
append(m, x[i+1]);
append(m, close);
}
else
append(m, x[i]);
}
else {
if (x[i]=='(')
Push(x[i], P);
else if (x[i]==')'){
PtrToNode PTN= P->Next;
char ch=Pop(P);
while (ch!='(') {
append(m,PTN->Element);
ch=Pop(P);
}
}
else {
char peak=Peak(P);
if (peak=='+'||peak=='-'){
if (x[i]=='*'||x[i]=='/'||x[i]=='%'){
Push(x[i], P);
}
else {
char whatever = Pop(P);
Push(x[i], P);
append(m,whatever);
}
}
else {
if (peak=='*'||peak=='/'||peak=='%'){
char whatever = Pop(P);
append(m,whatever);
Push(x[i], P);
}
}
}
}
}
printf("%s",m);
return m;
}
答案 0 :(得分:2)
或者:
A)s
所指的是不可修改的,或者
B)s
不足以容纳strlen(s) + 2
个字符
编辑:你发布了你的代码,答案是......两者都有,但A更紧迫。
char* m="";
/* ... */
append(m, open);
m
是一个不可修改的字符串。任何修改此类分配的字符串文字的尝试都会导致未定义的行为。即使它是可修改的,它也不足以在没有重新分配的情况下将另一个字符连接起来。
如果您希望更改m
引用的内容,请按以下方式进行分配:
char m[size];
或
char *m = malloc(size);
此外,您需要为最大可能的连接字符串分配足够的空间,或者在调用append
之前分配更多内存。
另外,str
中的append
未使用且完全没必要。