无法获得具有此头的方法:char * strcpy (char *cad1, const char *cad2)
,在此示例中如何在C中工作:
'char * strcpy (char *cad1, const char *cad2){
char *aux = cad1;
for( ; *cad1++ = *cad2++; );
return cad1;
}'
答案 0 :(得分:0)
从方法签名或原型开始,它告诉了很多有关它是如何工作的:我们有两个参数以及它们各自的类型和返回类型。在这种情况下,所有参数都是指向char的指针,也称为char指针。这些字符指针是在“ C”中用作字符串的字符。一个参数是const,因为该值不得在函数中更改,它必须保留原始值。 “ C”中的字符串具有一些特殊性,一旦创建指向字符串的指针,它始终指向字符串或索引0中的第一个字符,与char * v = var [0]相同,并且可以递增地传递给字符串中的下一个字符,例如v ++。 “ C”的另一个特殊之处是,所有由char数组表示的字符串都以0字符(ASCII null = 0)结尾。
有关该概念的strcpy版本说明,并进行for循环以将char * cad2中的每个元素复制到* cad1,该变量必须在调用函数之前静态或动态分配(malloc),然后返回函数在上面的代码中,是指向原始变量的指针(在这种情况下,* cad1,通常它们返回复制的变量)。在您的函数中,它已更改,我的意思是,它返回的是原始副本,而不是复制的看起来错误的内容,因为您在aux中捕获了指向复制变量的第一个元素的指针,而您没有使用它。
要观察的一个好点是for循环:
for( ; *cad1++ = *cad2++; );
它的工作方式很棘手,第一个有趣的点是for循环具有树参数,并且在“ C”中所有参数都是可选的。第一个是初始化,第二个是继续迭代的布尔条件,最后一个是递增或递减。 接下来,棘手的是* cad1 ++ = * cad2 ++是布尔表达式吗?答案是肯定的。由于在“ C”中,值0(零)为false,其他则为true。请记住,我曾说过“ C”中的字符串总是以0(零)结尾,所以当评估并向副本分配指针值时(使用* cad1将返回指针变量所指向的值,即begin使它具有魔力)并到达字符串的末尾,该字符串将返回false并完成迭代循环。 这里有一点很有趣,在这种情况下,首先求值的优先级比赋值低,这就是首先将值复制到复制变量,然后才对布尔表达式求值的原因。
“ C”就是这样,您编写了一个小的代码,其背后具有重要的意义。希望您理解了解释。有关更多信息,请查看https://www.tutorialspoint.com/cprogramming/c_pointers.htm处的“ C”指针。
答案 1 :(得分:0)
char * strcpy (char *cad1, const char *cad2){
for( ; *cad1++ = *cad2++;);
return cad1;
}
此方法的工作方式在调用方可以以两种方式使用,但始终需要写入缓冲区,因此用法很简单。
char arr[255];
memset(arr,0,sizeof(char) * 255); // clear the garbage initialized array;
strcpy(arr, "this is the text to copy that is 254 characters long or shorter.");
puts(arr);
或
char arr[255];
memset(arr,0,sizeof(char) * 255);
puts(strcpy(arr,"hello C!"));
sense函数将指针返回到同样有效的缓冲区。