需要帮助理解这个用函数模拟 strcpy() 的 C 程序

Need help understanding this C program which simulates strcpy() with a function

这是我的代码。我正在尝试模拟 strcpy()。此代码有效,但我有几个问题。

#include <stdio.h>
#include <stdlib.h>

char *strcpy(char *d, const char *s);

int main()
{
    char strOne[] = "Welcome to the world of programming!";
    char strTwo[] = "Hello world!";
    printf("String One: %s\n", strOne);
    printf("String Two before strcpy(): %s\n", strTwo);
    strcpy(strTwo, strOne);
    printf("String Two after strcpy(): %s\n", strTwo);

    return 0;
}

char *strcpy(char *d, const char *s)
{
   while (*s)
   {
       *d = *s;
       d++;
       s++;
   }
   *d = 0;
   return 0;
}
  1. 当*s递增到数组中存放'\0'的位置时,是不是因为'\0'导致while条件变为假? while read '\0' 还是只是 '0'?

  2. 如果
  3. 'while' 条件为“1”,则条件为真。 *s 的所有先前值都应在 while 条件中读取为单个字符,但循环仍会执行。为什么会这样?数组 *s 指向的所有单个字符是否都等于值“1”?

  4. *d = 0; 究竟是做什么的?按照我的理解,复制过程在退出 while 循环时完成。那么,为什么删除 *d = 0 会导致显示不正确的输出?

没有*d = 0的输出:

String Two before strcpy(): Hello world!                                                                                       
String Two after strcpy(): Welcome to the world of programming! programming! 

输出 *d = 0 :

String Two before strcpy(): Hello world!                                                                                       
String Two after strcpy(): Welcome to the world of programming! 

ASCII table 中的字符假定值范围从 01270NULL'[=14=]',所以条件总是 true 除非字符是 '[=14=]'.

*d = 0 在字符串末尾放置一个 '[=14=]';这就是字符串在 C 语言中终止的方式。如果不终止字符串,则可以在字符串末尾之后打印任何内容,并且程序无法知道它在哪里结束。这是未定义的行为。

再说几句。你 return 0 而不是指向 char 的指针。你应该得到一些警告。 Return 复制。顺便说一句,这个功能也可以稍微简化一下。

char *strcpy(char *d, const char *s)
{
   char *saved = d;
   while ((*d++ = *s++));
   return saved;
}