0

我正在尝试将 char 附加到 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;
}
4

1 回答 1

2

任何一个:

A)s所指的内容不可修改,或 B)s不足以容纳strlen(s) + 2字符

编辑:你发布了你的代码,答案是......两者都是,但 A 更紧迫。

char* m=""; 
/* ... */
append(m, open);

m是不可修改的字符串。任何试图修改在这种方式中分配的字符串文字都会导致未定义的行为。即使它是可修改的,它也不足以在不重新分配的情况下连接另一个字符。

如果您想更改m所指的内容,请像这样分配它:

char m[size];

或者

char *m = malloc(size);

此外,您需要预先为最大可能的串联字符串分配足够的空间,或者在调用之前分配更多内存append

顺便说一句,strinappend未使用且完全没有必要。

于 2013-04-11T19:59:55.360 回答