许多字符串函数返回一个指针,但是返回指向目标和返回目标的指针的优点是什么?
#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;
}
答案 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
是与dst
和src
不重叠的来电者签订的合同。请注意,这可能仍然是天真的实现 - 它适用于小型微控制器,但是当涉及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);
后一版本更安全,更易于阅读。生成的机器代码将完全相同。