strcat时的未定义行为

时间:2015-07-18 15:05:49

标签: c strcat

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

我在case ')'处的代码出现问题。

我的代码未完成,因为它错过了几行代码,将所有最终char = operators内部堆栈添加到tempExp,我很快就会发现它。我现在需要的是你输入为什么这一行while(c[0] != '(') strcat(tempExp, c);会导致未定义的行为。

非常感谢!

注意:这个混乱的代码c[0] = *((char*)pop(s))的原因是pop返回void*,我无法为此练习更改。

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);
}

2 个答案:

答案 0 :(得分:4)

除了Grantly指出的无限循环之外,你还有其他几个问题,主要是因为两件事:

  1. 您的循环包含in的字符串终止符,因此您将在switch语句中以默认情况结束,您将在其中调用priority('\0')导致你的第二个问题。您还将使用指向字符串终止符的指针调用push,如果push假定指针不在字符串的末尾,那么您也可能遇到问题。

  2. 第二个问题是使用priority函数,因为如果你传递了一个在你的条件中不期望的字符,它就不会返回导致未定义行为的所有分支的值 (例如字符串终止符)。您需要添加明确的else子句。

答案 1 :(得分:1)

循环

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

将无限期地运行(假设c [0]不是&#39;(&#39;),超出字符串的大小(256个字符),因为它会继续在tempExp上添加相同的字符串(c)这会导致无数错误,但通常是堆栈溢出或缓冲区溢出...只有当字符串(256)的末尾到达时才会出现未定义的行为,从那时起就会崩溃不明白