百科问答小站 logo
百科问答小站 font logo



strcpy的源代码中返回值是指针的意义是什么? 第1页

  

user avatar   d41d8c 网友的相关建议: 
      

现在看来返回值是选错了。如果 strcpy 返回的是 dest 的末尾(而非开头)的话,连接字符串会省事很多。

读者看到这里肯定会说“连接字符串用 strcat 啊”。但 strcat 的问题是 strcat 需要找到 dest 的末尾,如果只连接一次倒是无所谓,但是如果用 strcat 连接三个以上字符串的话,就需要多次调用 strcat ,每次都要遍历 dest 以找到 dest 字符串的末尾,这就很低效。

strcpy 在执行过程中本来就会计算出 dest 的末尾(因为复制到那里结束)。如果它能返回这个信息的话,连接字符串就可以写成

       end = strcpy(buf, str1); end = strcpy(end, str2); strcpy(end, str3);     

然而 strcpy 却丢弃了这个信息,返回了调用方本来就知道(因为是调用方传给 strcpy)的信息。导致 C 程序要想更高效地连接字符串,只能自己找字符串末尾。

       strcpy(buf, str1); end = buf + strlen(buf); strcpy(end, str2); end = end + strlen(end); strcpy(end, str3);     

为满足连接字符串的需求,POSIX 和 C23 提供了一个可以做到 strcpy 相同效果,但返回 dest 末尾的替代品: memccpy (注意有两个 c)


user avatar   haozhi-yang-41 网友的相关建议: 
      

方便链式调用。


user avatar   timothyqiu 网友的相关建议: 
      

在需要的时候用,只不过不是每次使用都需要呀……

       char *p = strcpy(malloc(10), "foo");  // 分配并初始化内容,不过这样写你就没法处理内存分配失败的情况了  function_that_modifies_input_buffer(strcpy(buf, "foo"));  // 和上面其实差不多  strcpy(buf1, strcpy(buf2, "foo"));  // 这个人很懒      

这就类似于,我在小卖部结帐时从不拿小票,打小票出来又有什么用,有什么意义呢?




  

相关话题

  为何 Boost 的 Asio 要使用 Proactor 模式实现? 
  #define 不是简单的替换吗,为什么下面的代码错误? 
  为什么指针不能相加? 
  LeetCode上 C++ 官方题解为什么有很多没有写delete,不会内存泄漏么?面试时也可以么? 
  为什么尽管 C++ 早就有了很多现代功能,但是却长期给人原始的印象呢? 
  怎样理解C语言是才是代码的精髓,可以让你领略不一样的世界这句话?(其实就是怎么翻译成人话-_-# 
  为什么大多数人用C++时都要用&&,||和!来表示与或非,而不是用and or not? 
  在 C++ 里实现矩阵库的关键点是什么? 
  为什么1ULL << 64得到的结果是1? 
  Linux C++ 服务器端这条线怎么走?一年半能做出什么? 

前一个讨论
太空垃圾被地球引力吸引,垃圾在大气层坠落的过程中会烧毁殆尽,那么地球不就等于超自然焚化炉吗?
下一个讨论
如何评价万科副总裁刘肖,因北方区域事业集团的违规违纪问题,被连降两级,并扣减1000万元奖金?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利