in = "(A + B) * C - D * F + C";
#define MAXL 256

我在case ')'的代码有问题。
我的代码还没有完成,因为它漏掉了几行代码,无法将堆栈中所有的最后char = operators添加到tempExp中,我很快就会知道。我现在需要的是你的输入,为什么这一行会导致未定义的行为。
非常感谢你!
注意:这个混乱的代码while(c[0] != '(') strcat(tempExp, c);的原因是pop返回一个c[0] = *((char*)pop(s)),我不能为了这个练习而更改它。
void convertIntoPost(char * in, char ** out)
{
    int i;
    Stack * s = createStack();
    char tempExp[MAXL] = "temp: ", c[2];
    c[1] = '\0';
    printf("\n%s\n", tempExp);
    for(i = 0; i <= strlen(in); ++i)
    {
        printf("i: %d", i);
        c[0] = in[i];
        if(isalpha(c[0]) || isalnum(c[0]))
        {
            c[0] = in[i];
            printf("\nc passed isalpha OR isalnum: %s\n", c);
            strcat(tempExp, c);
        }
        else
        {
            switch(in[i])
            {
                case ' ' : break;
                case '(' :
                    push(s, &in[i]);
                    break;
                case ')' :
                    c[0] = *((char*)pop(s));
                    printf("c in case ')': %s", c); /* Show expected result */
                    printf("\n%s", tempExp); /* Just checking tempExp and see no problem */
                    while(c[0] != '(')
                        strcat(tempExp, c);
                    printf("\n%s", tempExp); /* Program stopped before it gets here */
                    break;
                default :
                    while(!isEmpty(s) && (priority(in[i]) <= priority(c[0] = *((char*)pop(s)))))
                        strcat(tempExp, c);
                    push(s, &in[i]);
            }
        }
    }
    printf("\nThis is in: %s", in);
    printf("\n%s", tempExp);
    *out = (char*)malloc(strlen(tempExp) + 1);
    *out = strdup(tempExp);
    makeEmpty(s);
}

int priority(char c)
{
    if(c == '(')
        return(0);
    else if(c == '+' || c == '-')
        return(1);
    else if(c == '*' || c == '/')
        return(2);
}

最佳答案

循环

while(c[0] != '(')
   strcat(tempExp, c);

将无限期运行(假设c[0]不是“(”),超出字符串大小(256个字符),因为它将继续向tempExp添加相同的字符串(c)。这将导致无数错误,但通常是堆栈溢出或缓冲区溢出。。。只有在字符串(256)结束时才有未定义的行为,从那时起,它将意外崩溃

10-07 15:21