需要帮助理解这个用函数模拟 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;
}
当*s递增到数组中存放'\0'的位置时,是不是因为'\0'导致while条件变为假? while read '\0' 还是只是 '0'?
如果 'while' 条件为“1”,则条件为真。 *s 的所有先前值都应在 while 条件中读取为单个字符,但循环仍会执行。为什么会这样?数组 *s 指向的所有单个字符是否都等于值“1”?
*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 中的字符假定值范围从 0
到 127
,0
是 NULL
或 '[=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;
}
这是我的代码。我正在尝试模拟 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;
}
当*s递增到数组中存放'\0'的位置时,是不是因为'\0'导致while条件变为假? while read '\0' 还是只是 '0'?
如果 'while' 条件为“1”,则条件为真。 *s 的所有先前值都应在 while 条件中读取为单个字符,但循环仍会执行。为什么会这样?数组 *s 指向的所有单个字符是否都等于值“1”?
*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 中的字符假定值范围从 0
到 127
,0
是 NULL
或 '[=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;
}