在 strcpy 函数中使用指针作为参数。试图从书中理解代码
Usage of pointers as parameters in the strcpy function. Trying to understand code from book
来自我的书:
void strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’[=10=]’)
++i;
}
我正在尝试从我的课本中理解这段代码。它们没有提供主要功能,所以我试图思考如何在函数调用中使用参数。据我了解,字符串 t[ ] 中字符的 "i-number" 被复制到字符串 s[ ] 中,直到从 \0 转义序列中不再有字符可读。我真的不明白如何在函数之外定义参数。任何帮助是极大的赞赏。谢谢你。
这里要记住两件事:
- C 中的字符串是
char
s 的数组
- 数组作为指针传递给函数
所以你可以这样称呼它:
char destination[16];
char source[] = "Hello world!";
strcpy(destination, source);
printf("%s", destination);
i
只是一个内部变量,它在 strcpy
函数之外没有任何意义(它不是参数或任何东西)。此函数将整个字符串 t
复制到 s
,并在它看到 [=16=]
字符(根据 C 约定标记字符串的结尾)时停止。
编辑:此外,strcpy
是标准库函数,因此如果您尝试重新定义它,可能会发生奇怪的事情。给你的副本一个新的名字,一切都会好起来的。
这是给你的主菜:
int main()
{
char buf[30];
strcpy(buf, "Hi!");
puts(buf);
strcpy(buf, "Hello there.");
puts(buf);
}
s
和 t
的要点是接受程序中其他地方存在的字符数组。它们在别处定义,在这一层通常由直接调用者或上面的另一个调用者定义。它们的含义在运行时被替换。
你的编译有问题是因为你的书错了。应该阅读
const strcpy (char *s, const char *t)
{
...
return s;
}
其中const
表示不会修改。因为 strcpy
是一个标准函数,所以您确实需要它是正确的。
以下是您可能如何使用该函数(注意您应该更改函数名称,因为它会与标准库冲突)
void my_strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’[=10=]’)
++i;
}
int main()
{
char *dataToCopy = "This is the data to copy";
char buffer[81]; // This buffer should be at least big enough to hold the data from the
// source string (dataToCopy) plus 1 for the null terminator
// call your strcpy function
my_strcpy(buffer, dataToCopy);
printf("%s", buffer);
}
在代码中,i
变量指向字符数组中的字符。因此,当 i
为 0 时,您指向 s
和 t
的第一个字符。 s[i] = t[i]
将第 i 个字符从 t
复制到 s
的第 i 个字符。 C 中的这个赋值本身是一个表达式,returns 是被复制的字符,这使您可以将其与空终止符 0
进行比较,即。 (s[i] = t[i]) != ’[=19=]’
表示字符串结束,如果复制的字符不是空终止符则循环继续,否则将结束。
来自我的书:
void strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’[=10=]’)
++i;
}
我正在尝试从我的课本中理解这段代码。它们没有提供主要功能,所以我试图思考如何在函数调用中使用参数。据我了解,字符串 t[ ] 中字符的 "i-number" 被复制到字符串 s[ ] 中,直到从 \0 转义序列中不再有字符可读。我真的不明白如何在函数之外定义参数。任何帮助是极大的赞赏。谢谢你。
这里要记住两件事:
- C 中的字符串是
char
s 的数组
- 数组作为指针传递给函数
所以你可以这样称呼它:
char destination[16];
char source[] = "Hello world!";
strcpy(destination, source);
printf("%s", destination);
i
只是一个内部变量,它在 strcpy
函数之外没有任何意义(它不是参数或任何东西)。此函数将整个字符串 t
复制到 s
,并在它看到 [=16=]
字符(根据 C 约定标记字符串的结尾)时停止。
编辑:此外,strcpy
是标准库函数,因此如果您尝试重新定义它,可能会发生奇怪的事情。给你的副本一个新的名字,一切都会好起来的。
这是给你的主菜:
int main()
{
char buf[30];
strcpy(buf, "Hi!");
puts(buf);
strcpy(buf, "Hello there.");
puts(buf);
}
s
和 t
的要点是接受程序中其他地方存在的字符数组。它们在别处定义,在这一层通常由直接调用者或上面的另一个调用者定义。它们的含义在运行时被替换。
你的编译有问题是因为你的书错了。应该阅读
const strcpy (char *s, const char *t)
{
...
return s;
}
其中const
表示不会修改。因为 strcpy
是一个标准函数,所以您确实需要它是正确的。
以下是您可能如何使用该函数(注意您应该更改函数名称,因为它会与标准库冲突)
void my_strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’[=10=]’)
++i;
}
int main()
{
char *dataToCopy = "This is the data to copy";
char buffer[81]; // This buffer should be at least big enough to hold the data from the
// source string (dataToCopy) plus 1 for the null terminator
// call your strcpy function
my_strcpy(buffer, dataToCopy);
printf("%s", buffer);
}
在代码中,i
变量指向字符数组中的字符。因此,当 i
为 0 时,您指向 s
和 t
的第一个字符。 s[i] = t[i]
将第 i 个字符从 t
复制到 s
的第 i 个字符。 C 中的这个赋值本身是一个表达式,returns 是被复制的字符,这使您可以将其与空终止符 0
进行比较,即。 (s[i] = t[i]) != ’[=19=]’
表示字符串结束,如果复制的字符不是空终止符则循环继续,否则将结束。