strcat时未定义的行为

strcat时未定义的行为,c,strcat,C,Strcat,我在case')的代码有问题。 我的代码没有完成,因为它在某个地方遗漏了几行代码,无法将堆栈中的所有最终char=operators添加到tempep,我可能很快就会弄明白™. 我现在需要的是您的输入,说明为什么这一行而(c[0]!='(')strcat(tempExp,c);会导致未定义的行为 多谢各位 注意:这个混乱代码c[0]=*((char*)pop(s))的原因是pop返回一个void*,我不能为了本练习的目的更改它 in = "(A + B) * C - D * F + C"; #d

我在
case')的代码有问题。

我的代码没有完成,因为它在某个地方遗漏了几行代码,无法将堆栈中的所有最终
char=operators
添加到
tempep
,我可能很快就会弄明白™. 我现在需要的是您的输入,说明为什么这一行
而(c[0]!='(')strcat(tempExp,c);
会导致未定义的行为

多谢各位

注意:这个混乱代码
c[0]=*((char*)pop(s))
的原因是pop返回一个
void*
,我不能为了本练习的目的更改它

in = "(A + B) * C - D * F + C";
#define MAXL 256
void convertinotost(字符*输入,字符**输出)
{
int i;
Stack*s=createStack();
char tempExp[MAXL]=“temp:”,c[2];
c[1]='\0';
printf(“\n%s\n”,tempExp);
对于(i=0;i循环

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);
}
将无限期运行(假设c[0]不是“(”),超出字符串的大小(256个字符),因为它将继续将相同的字符串(c)添加到tempExp上。这将导致无数错误,但通常是堆栈溢出或缓冲区溢出…只有在字符串(256)结束时,才会出现未定义的行为到达时,从那时起它将不公平地崩溃循环

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

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

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

  • 您的循环在
  • 中包含
    的字符串终止符,因此您将在
    开关
    语句的默认情况下结束,您将在该语句中调用有效的
    优先级('\0')
    这导致了第二个问题。您还将使用指向字符串终止符的指针调用
    push
    ,如果
    push
    假定指针不在字符串的末尾,您可能也会遇到问题

  • 第二个问题是
    priority
    函数,因为如果传递条件中不需要的字符(例如字符串终止符),它不会为导致未定义行为的所有分支返回值。您需要添加显式
    else
    子句


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

  • 您的循环在
  • 中包含
    的字符串终止符,因此您将在
    开关
    语句的默认情况下结束,您将在该语句中调用有效的
    优先级('\0')
    这导致了第二个问题。您还将使用指向字符串终止符的指针调用
    push
    ,如果
    push
    假定指针不在字符串的末尾,您可能也会遇到问题

  • 第二个问题是
    priority
    函数,因为如果传递条件中不需要的字符(例如字符串终止符),它不会为导致未定义行为的所有分支返回值。您需要添加显式
    else
    子句


  • 您是否应该具有while永远不会运行或永远不会停止的条件。
    strcat
    (连续)连接整个字符串<代码>代码>代码>,不只是第一个字符。它也没有删掉<代码> C <代码>。看来帕万来自另一种语言。@为什么他应该在Mizushima?:考虑删除未定义的行为标签。@约阿希姆我测试,斯特伦返回字符串的长度,排除终止符。这是
    中,前两个过程没有使程序崩溃。您是否认为while永远不会运行,或者它永远不会停止的条件是
    strcat
    (连续)连接整个字符串<代码>代码>代码>,不只是第一个字符。它也没有删掉<代码> C <代码>。看来帕万来自另一种语言。@为什么他应该在Mizushima?:考虑删除未定义的行为标签。@约阿希姆我测试,斯特伦返回字符串的长度,排除终止符。这是中,前两个过程没有使程序崩溃。就这么简单!非常感谢!我将while改为if,现在就可以了。就这么简单!非常感谢!我将while改为if,现在就可以了。在你的第一点中,我很有可能在这里出错,但当我测试
    strlen
    语句时:
    char c=“123456789”printf(“%d”,strlen(c));
    将显示9,这是不包括终止符的长度,因此我无法看到
    '\0'
    将如何进入我的循环。请帮助我查看它。第二点,我相信你是对的,我正在研究它。非常感谢!@MizushimaHideyoshi记得索引是从零开始的,所以字符串的正确索引
    “123456789”
    0
    8
    (包括在内)。哦,对了!这是一个基本错误。很抱歉我太迟钝了。谢谢你澄清!在你的第一点中,我很有可能出错,但当我测试
    strlen
    语句时:
    char c=“123456789”;printf(“%d”,strlen(c));
    将显示9,这是不包括终止符的长度,因此我无法看到
    '\0'
    将如何进入我的循环。请帮助我查看它。第二点,我相信你是对的,我正在研究它。非常感谢!@MizushimaHideyoshi记得索引是从零开始的,所以字符串的正确索引是
    ”123456789“
    0
    8
    (包括)。哦,对了!这是一个基本错误。很抱歉我太迟钝了。谢谢你的澄清