在strcpy函数中将指针用作参数。试图理解书中的代码
从我的书中:在strcpy函数中将指针用作参数。试图理解书中的代码,c,arrays,pointers,strcpy,C,Arrays,Pointers,Strcpy,从我的书中: void strcpy (char *s, char *t) { int i=0; while ((s[i] = t[i]) != ’\0’) ++i; } 我试图理解教科书中的这段代码。它们不提供主函数,所以我试图了解在调用函数时如何使用参数。据我所知,字符串t[]的“I-number”将被复制到字符串s[],直到从\0转义序列中不再有可读取的字符。我真的不明白参数是如何在函数之外定义的。非常感谢您的帮助。多谢各位 这里要记住两件事: C中的字符串是chars的数组 数组作为
void strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’\0’)
++i;
}
我试图理解教科书中的这段代码。它们不提供主函数,所以我试图了解在调用函数时如何使用参数。据我所知,字符串t[]的“I-number”将被复制到字符串s[],直到从\0转义序列中不再有可读取的字符。我真的不明白参数是如何在函数之外定义的。非常感谢您的帮助。多谢各位 这里要记住两件事:
- C中的字符串是
s的数组char
- 数组作为指针传递给函数
char destination[16];
char source[] = "Hello world!";
strcpy(destination, source);
printf("%s", destination);
i
只是一个内部变量,在strcpy
函数之外没有任何意义(它不是一个参数或任何东西)。此函数将整个字符串t
复制到s
,并在看到\0
字符(按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是一个标准函数,所以您确实需要它是正确的。以下是您可以如何使用该函数(注意,您应该更改函数名,因为它会与标准库冲突)
在代码中,
i
变量指向字符数组中的字符。因此,当i
为0时,您将指向s
和t
的第一个字符s[i]=t[i]
将第i个字符从t
复制到s
的第i个字符。C中的赋值是一个自表达式,返回复制的字符,允许您将其与空终止符0
进行比较,即(s[i]=t[i])!='\0'
表示字符串的结尾,如果复制的字符不是空终止符,循环将继续,否则将结束。确定。我理解strcpy在用作调用时的用法,但每当我试图按照我的书中的方式编译代码时,就会出现“strcpy的冲突类型”错误。这本书采用了一个预定义的函数并重新定义了它,这似乎很奇怪,但这可能是因为我缺乏知识。@yiwl<代码>strcpy是标准的库函数。把你的新的命名为strcpy0
或者别的什么,它应该可以正常工作。一个等价的while
应该是while((s[i]=t[i])i++代码>(提示:nul字符'\0'
的数值为0
)
void my_strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’\0’)
++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);
}