首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >strcpy和stpcpy有什么区别?

strcpy和stpcpy有什么区别?
EN

Stack Overflow用户
提问于 2011-04-29 09:01:40
回答 5查看 12.9K关注 0票数 21

在阅读strcpy的手册页时,我发现函数stpcpy也存在。但是,我在手册页中注意到的唯一区别是:

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

char *
strcpy(char *restrict s1, const char *restrict s2);

那么,restrict在这里是什么意思呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-29 09:06:18

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

还要注意,返回值是不同的:stpcpy返回一个指向复制到目标缓冲区中的\0的指针,而strcpy返回一个指向字符串开头的指针(它实际上执行了一个return s1;)。

票数 20
EN

Stack Overflow用户

发布于 2011-04-29 09:26:13

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

然而,这两个函数之间的主要区别并不是restrict说明符。事实上,在C99版本的C语言规范中,strcpy的参数也有restrict限定。您在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);

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

stpcpy(stpcpy(stpcpy(stpcpy(buffer, part1), part2), part3), part4);

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

char *end = buffer;

end = stpcpy(end, part1);
end = stpcpy(end, part2);
end = stpcpy(end, part3);
end = stpcpy(end, part4);

当然,值得一提的是,strcpystrcat是标准函数,而stpcpy不是。

票数 28
EN

Stack Overflow用户

发布于 2011-04-29 09:04:33

Wikipedia entry for restrict

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5826773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档