需要了解 char * strcpy (char *cad1, const char *cad2) 在 C 中的工作原理

Need to understand how char * strcpy (char *cad1, const char *cad2) works in C

无法了解具有此头的方法:char * strcpy (char *cad1, const char *cad2),在该示例中如何在 C 中工作:

'char * strcpy (char *cad1, const char *cad2){
        char *aux = cad1;
        for( ; *cad1++ = *cad2++; );
        return cad1;
 }'

从方法签名或原型开始,它说明了很多有关其工作原理的信息:我们有两个参数及其各自的类型和一个 return 类型。本例中的所有参数都是指向 char 的指针,也就是众所周知的 char 指针。这些 char 指针是 "C" 中用作字符串的指针。一个参数是 const,因为该值不能在函数中更改,它必须保留原始值。 "C" 中的字符串有一些特殊性,一旦创建了指向字符串的指针,它总是指向字符串中的第一个字符或索引 0,与 char *v = var[0] 相同,并且可以递增传递到字符串中的下一个字符,例如 v++。 "C" 的另一个特点是所有由 char 数组表示的字符串都以 0 字符结尾(ASCII null = 0)。

strcpy 版本考虑了这些概念并制作了一个 for 循环以将 char *cad2 中的每个元素复制到 *cad1,在调用函数之前必须静态或动态(malloc)分配变量,并且 [=上面代码中函数的 30=] 是指向原始变量的指针(在这种情况下 *cad1,通常它们 return 是复制的)。在你的函数中它被改变了,我的意思是它是 returning 原始而不是复制什么看起来不对,因为你在 aux 中捕获了指向复制变量的第一个元素的指针并且你没有使用它。

要观察的一个好点是 for 循环:

for( ; *cad1++ = *cad2++; );

它的工作原理很棘手,第一个有趣的地方是 for 循环有树形参数,在 "C" 中都是可选的。第一个是初始化,第二个是继续迭代的布尔条件,最后一个是递增或递减。 接下来,棘手的是 *cad1++ = *cad2++ 是布尔表达式吗?答案是肯定的。因为在 "C" 中,值 0(零)是假的,其他任何东西都是真的。请记住,我说过 "C" 中的字符串总是以 0(零)结尾,因此在评估指针的值并将其分配给副本时(使用 *cad1 将 return 指针指向的值变量,开头的星号使它变得神奇)并到达将 return false 的字符串的末尾并完成迭代循环。 这里有一点很有趣,首先在这种情况下求值的优先级低于赋值,这使得首先将值复制到复制变量,然后计算布尔表达式。

"C" 就是这样你写的小代码背后蕴含着大意义。我希望你已经理解了解释。有关更多信息,请查看 "C" 指针:https://www.tutorialspoint.com/cprogramming/c_pointers.htm.

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!"));

感知函数 returns 指向缓冲区的指针这同样有效。