【问题标题】:Need to understand how char * strcpy (char *cad1, const char *cad2) works in C需要了解 char * strcpy (char *cad1, const char *cad2) 在 C 中的工作原理
【发布时间】:2018-11-19 19:43:51
【问题描述】:

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

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

【问题讨论】:

  • 嗨@LauraCooper,欢迎来到 StackOverflow。您可以查看how to ask 来改进这个问题和未来的问题。特别是,您应该提供一些研究工作来探索您已经尝试过自己解决问题。特别是这不是要求“请解释此代码” 的网站。 See here for more information.
  • 不管怎样,我的 C 已经生锈了,但基本上这个函数所做的就是将 cad2 的内容复制到 cad1 并返回一个指向 cad1 的指针。它通过 char 迭代 cad2 char 并将它们分配给 cad1 来工作。直到cad2 结束(在\0,这才打破循环。这个解释非常模糊,更熟悉 C 的人可以给出更好的解释。 (另请注意,这不是复制的安全实现,因为cad2 可能比原始cad1 大得多,然后覆盖它之外的内存,可能已经分配。)
  • 我认为这里的返回值是错误的。
  • @johnathan:(*cad1++ = *cad2++) 表达式的值实际上是增量之前的*cad2。我相信你的建议不会写空终止字符。

标签: strcpy


【解决方案1】:

从方法签名或原型开始,这说明了它的工作原理:我们有两个参数以及它们各自的类型和一个返回类型。在这种情况下,所有参数都是指向 char 的指针,更称为 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(零)是假的,其他的都是真的。请记住,我已经说过“C”中的字符串总是以 0(零)结束,因此在评估并分配给副本时指针的值(使用 *cad1 将返回指针变量指向的值,星号在begin 使那个神奇)并到达将返回 false 并完成迭代循环的字符串的末尾。 这里有一点很有趣,首先在这种情况下,求值的优先级低于赋值,是什么首先将值复制到复制变量,然后求值布尔表达式。

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

【讨论】:

  • 非常感谢!我完全理解了一切,很好的解释
【解决方案2】:
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 函数返回指向缓冲区的指针,这也有效。

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多