为什么while(*s ++!='\ 0')不起作用?

Che*_*hen 2 c

我写了一个函数将字符串t复制到s的末尾,如果我这样写,它就有效

    char strcat(char *s, char *t) {
    while (*s != '\0')
        s++;
    while ((*s++ = *t++) != '\0')
        ;
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样写它就不起作用

    char strcat(char *s, char *t) {
    while (*s++ != '\0')
        ;
    while ((*s++ = *t++) != '\0')
        ;
    }
Run Code Online (Sandbox Code Playgroud)

我不明白它们之间有什么区别

while (*s++ != '\0')
        ;
Run Code Online (Sandbox Code Playgroud)

while (*s != '\0')
        s++;
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 11

当你使用

while (*s++ != '\0');
Run Code Online (Sandbox Code Playgroud)

s循环中断时指向空字符后的一个字符.您最终复制的内容ts但在空字符之后.

如果s"string 1"功能之前t"string 2",在函数结束时,你会最终有一个字符数组,这将是这样的:

{'s', 't', 'r', 'i', 'n', 'g', ' ', '1', '\0', 's', 't', 'r', 'i', 'n', 'g', ' ', '2', '\0', ... }
                                         ^^^^
Run Code Online (Sandbox Code Playgroud)

由于中间存在空字符,因此"string 2"在大多数用途中都不会看到.

另一方面,当你使用:

while (*s != '\0')
        s++;
Run Code Online (Sandbox Code Playgroud)

s循环中断时指向空字符.给定相同的输入,您将得到一个如下所示的字符数组:

{'s', 't', 'r', 'i', 'n', 'g', ' ', '1', 's', 't', 'r', 'i', 'n', 'g', ' ', '2', '\0', ... }
                     No null character in the middle.
Run Code Online (Sandbox Code Playgroud)