带有和没有指针的C中的字符串副本

wuy*_*bao 2 c string pointers copy

有两个版本的字符串复制函数用C编写.我的问题是为什么版本1需要"!='\ 0'"但版本2不需要.如果我使用版本2复制字符0,"0"将终止应对过程怎么办?

void version1(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

char *version2(char *dest, const char *src)
{
    char *addr = dest;
    while (*dest++ = *src++);
    return addr;
}
Run Code Online (Sandbox Code Playgroud)

另外,为什么像"1230456"这样的输入不会终止复制,因为'0'出现在字符串的中间?

das*_*ght 6

这是因为在C中,零比较是可选的.在需要逻辑表达式的上下文中使用表达式时,C会为您插入一个隐式比较为零.

您可以在不更改语义的情况下重写第一个函数:

while ((to[i] = from[i]))
    ++i;
Run Code Online (Sandbox Code Playgroud)

此外,您可以重写第二个函数,如下所示:

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