循环中奇怪的指针行为

Soa*_*Cro 3 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,代码工作得很好.

while(*x) x++;
Run Code Online (Sandbox Code Playgroud)

lur*_*ker 12

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

while(*x++);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将在null之后附加第二个字符串,以便字符串的一部分不会"看到".字符串变成了"abc\0def".

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

while(*x) x++;
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*ley 6

这个循环:

while(*x++);
Run Code Online (Sandbox Code Playgroud)

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