strcpy和stpcpy有什么区别?

sid*_*yll 17 c string

在阅读手册页时strcpy,我发现该功能stpcpy也存在.但是,我在手册页中注意到的唯一区别是:

char *
stpcpy(char *s1, const char *s2);

char *
strcpy(char *restrict s1, const char *restrict s2);
Run Code Online (Sandbox Code Playgroud)

那么,这restrict意味着什么呢?

AnT*_*AnT 24

你在标题和问题中提出的问题restrict实际上是两个完全不相关的问题.其他答案已经为您提供了一些很好的链接,可以帮助您了解更多信息restrict.

但是,这两个功能之间的主要区别并不在于restrict说明者.实际上,在C99版本的C语言规范中,strcpyrestrict对其参数有资格.您在手册页上看到的strcpy内容根本未更新为符合C99.

主要区别(你似乎错过了)是返回值stpcpy.stpcpy返回指向\0目标字符串的终止字符的指针.这立即明确了stpcpy其存在的目的和基本原理:strcat当您需要将多个子字符串连接成一个字符串时,此函数旨在用作智能替代函数.你看,strcat在这样的应用程序中工作得很差(我甚至说它strcat在实际代码中没有任何有意义的用途).问题strcat在于,每次向其添加内容时,它都会重新扫描目标字符串,因此会进行大量不必要的工作,并且基本上会产生比光更多的热量.例如,以下代码遇到了这个问题

const char *part1, *part2, *part3, *part4;
...
char buffer[size]; /* assume that `size` is calculated properly */

strcpy(buffer, part1);
strcat(buffer, part2);
strcat(buffer, part3);
strcat(buffer, part4);
Run Code Online (Sandbox Code Playgroud)

通过使用,可以以更合理的方式重新实现此代码 stpcpy

stpcpy(stpcpy(stpcpy(stpcpy(buffer, part1), part2), part3), part4);
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢链式调用,则可以使用中间指针来存储中间stpcpy调用的返回值

char *end = buffer;

end = stpcpy(end, part1);
end = stpcpy(end, part2);
end = stpcpy(end, part3);
end = stpcpy(end, part4);
Run Code Online (Sandbox Code Playgroud)

当然,值得一提的是,strcpystrcat是标准功能,而stpcpy不是.

  • "`strcat`的+1在实际代码中没有任何有意义的用途". (3认同)
  • 值得补充的是,stpcpy 自 2008 版本以来在 POSIX 中定义。 (2认同)

Jam*_*lis 18

restrict告诉编译器s1s2指向不同阵列,并且有在被指向的数组没有重叠.在某些情况下,这可能允许编译器执行额外的优化(即,它可能复制多个字符的块而不必检查重叠).

还要注意返回值是不同的: stpcpy返回指向\0被复制到目标缓冲区strcpy的指针,同时返回指向字符串开头的指针(实际上它是a return s1;).


Mar*_*off 6

维基百科条目 restrict

简而言之,restrict告诉编译器s1和s2指向的内存段不重叠; 这允许代码执行较少的错误检查.