需要了解 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 指向缓冲区的指针这同样有效。
无法了解具有此头的方法: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 指向缓冲区的指针这同样有效。