在阅读手册页时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语言规范中,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);
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)
当然,值得一提的是,strcpy
和strcat
是标准功能,而stpcpy
不是.
Jam*_*lis 18
该restrict
告诉编译器s1
和s2
指向不同阵列,并且有在被指向的数组没有重叠.在某些情况下,这可能允许编译器执行额外的优化(即,它可能复制多个字符的块而不必检查重叠).
还要注意返回值是不同的: stpcpy
返回指向\0
被复制到目标缓冲区strcpy
的指针,同时返回指向字符串开头的指针(实际上它是a return s1;
).