为什么strcpy返回char *而不是char

时间:2018-06-04 14:28:36

标签: c

许多字符串函数返回一个指针,但是返回指向目标和返回目标的指针的优点是什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *sstrcpy ( char *destination, const char *source ){ //return a pointer to destination

    while ((*destination++ = *source++));
    *destination='\0';

return destination;
}

char sstrcpy2 ( char *destination, const char *source ){ //return destination

    while ((*destination++ = *source++));
    *destination='\0';

    return *destination;
}

int main(void){
    char source[] = "Well done is better than well said";
    char destination[40];

    sstrcpy ( destination, source );
    printf ( "%s\n", destination);



    return 0;
}

2 个答案:

答案 0 :(得分:7)

这个想法是提供链接功能的可能性。即将一个函数结果作为参数传递给另一个函数。

sstrcpy ( destination2, sstrcpy ( destination1, source ));

对于建议的sstrcpy2 - 它只会返回一个,即复制字符串的最后一个字符,在您的实现中显然是\0,在大多数情况下这是无用的。

<强>更新
  请注意,实现sstrcpy不正确,它将返回destination的值,该值已经移动到字符串的末尾,而不是指向它开头的指针。或者,我建议保存原始指针并增加它的副本:

char *sstrcpy ( char *destination, const char *source ){ //return a pointer to destination

    char *dst = destination;
    while ((*dst++ = *source++));
    *dst='\0';

    return destination;
}

答案 1 :(得分:1)

错误1:你返回字符串的结尾,而不是开头。
错误2:在末尾添加2个空终止符,而不是1。

正确的实施应该是:

char* sstrcpy (char*restrict dst, const char*restrict src)
{
  char* original = dst;
  for(*dst = *src; *src != '\0'; dst++, src++)
  {
    *dst = *src;
  }
  return original;
}

其中restrict是与dstsrc不重叠的来电者签订的合同。请注意,这可能仍然是天真的实现 - 它适用于小型微控制器,但是当涉及32位系统的strcpy库实现时,它们将使用对齐的数据块。

  

返回指向目的地和返回目的地的指针有什么好处?

没有任何优势;标准库充满了古怪。这允许两种无意义的混淆:

// Bad code, do not use!

/*1*/ str = strcpy(str, src); // pointless and potentially dangerous

/*2*/ strcpy(str2, strcpy(str1, src)); // pointless and potentially dangerous

这反过来又允许参数评估中的副作用导致错误,因此很危险。不要那样写垃圾。正确的版本是:

/*1*/ strcpy(str, src);

/*2*/ strcpy(str1, src);
      strcpy(str2, str1);

后一版本更安全,更易于阅读。生成的机器代码将完全相同。