循环中奇怪的指针行为

时间:2014-12-29 17:15:48

标签: c++ c string pointers

我无法弄清楚为什么这段代码不起作用。 (我知道如何修复它,但我对这个特定的解决方案很感兴趣)它需要一个字符串并且put在其他字符串的末尾。 x = "abc"y = "def"以及执行foo后x = "abcdef"。执行我的代码后,我只获得"abc"

#include <stdio.h>
#define MAX 10

void foo(char *x, char *y){
    while(*x++);
    while(*y){
        *x++ = *y++;
    }
    *x = '\0';
}

int main(void){
    char x[MAX+1], y[MAX+1];
    scanf("%s %s", x, y);
    foo(x, y);
    printf("%s", x);
    return 0;
}

如果我这样做,代码完全正常。

while(*x) x++;

3 个答案:

答案 0 :(得分:12)

即使在发现null并且循环完成后,此表达式也将递增x

while(*x++);

在这种情况下,您将在空后附加第二个字符串,以便字符串的一部分不会“看到”。该字符串变为"abc\0def"

当找到null时,以下内容不会递增x,因此在循环完成后*x将指向null:

while(*x) x++;

因此,在这种情况下,您的字符串会正确显示为"abcdef"

答案 1 :(得分:6)

这个循环:

while(*x++);

x移过空终止符。所以你的c-string和以前一样在同一个地方结束。 y中的字符会写入x,但它们会在空终结符之后,因此不会打印出来。

答案 2 :(得分:1)

使用时

while(*x++);

x指向语句末尾的空字符。实际上,你最终得到了

x[] = {'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0', ....}
main中的