为什么垃圾人物到底?

时间:2013-12-27 17:44:17

标签: c++ c

这里的例子:

   main()
   {   
    // code to insert characters in between where letters repeat twice                                            
    char b[20];
    int l,i=0;   

      cin>>b;
      l=strlen(b);
      while(i<=l-1)
       {    if (b[i]==b[i+1]){          
                     for(int j=l-1;j>i;j--) 
                      b[j+1]=b[j];
                     b[i+1]='x';      
                     l++;
                } 
                i++;
       }
      puts(b); 
      getch();
      return 0;
}

5 个答案:

答案 0 :(得分:5)

b[i+1]='x'中,\0字符会被覆盖。当您使用b打印puts时,它会调用未定义的行为。

答案 1 :(得分:3)

你的缩进是错误的。

if (b[i]==b[i+1])          
    for(int j=l-1;j>i;j--) 
    b[j+1]=b[j];
    b[i+1]='x';      
    l++;
} 

实际上是

if (b[i]==b[i+1])          
    for(int j=l-1;j>i;j--) 
        b[j+1]=b[j];
b[i+1]='x';      
l++;
} 

导致while循环的最后一次迭代用b覆盖'x'的空终止符。当您稍后调用puts(b)时,这会导致未定义的行为。在你的情况下,听起来你正在打印b的未初始化的结尾以及堆栈上的任何内容,直到找到值为0的字节为止。

您需要在任何多线条件下放置大括号{}。这种类型的错误也证明了为什么有些团队甚至对单行条件语句坚持括号

if (b[i]==b[i+1]) {
    for(int j=l-1;j>i;j--) {
        b[j+1]=b[j];
        b[i+1]='x';      
        l++;
    }
} 

答案 2 :(得分:0)

while(i<=l-1)

l-1 = 19, if i = 19,它将进入循环

if (b[i]==b[i+1]) // the if statement here you are accessing b[20] which is out of bound and will lead to junk data / undefined behaviors

答案 3 :(得分:0)

while(i<=l-1)
  ...
  b[i+1]='x';

使用i == l-1,你有b[l] = 'x'所以你覆盖了NUL终结符,字符串的末尾不再存在。这导致它的打印不会在它结束之前和之后的垃圾字符结束时结束。

答案 4 :(得分:0)

考虑到你正确缩进的版本是:

int main()   
    // code to insert characters in between where letters repeat twice 
{                                                                                  
    char b[20];
    int l,i=0;   

    cin>>b;
    l=strlen(b);
    while(i<=l-1)
    {    if (b[i]==b[i+1])                                                         
        for(int j=l-1;j>i;j--) 
            b[j+1]=b[j];
        b[i+1]='x';                                                                
        l++;
    }   
    i++;
}
puts(b); 
getch();
return 0;
}

我不知道这是怎么编的。你的字符串末尾需要'\0'