![]() |
1
4
strmove,strlmove,strcpy,strcat都是 不 标准C函数,所以如果不知道您使用的是哪个特定的非标准库,我就无法评论它们的作用。标准C提供strcpy、strcat、strncat、strncpy、memmove、memcpy等。 如果您不知道源字符串是否适合目标缓冲区,为了安全起见,使用strncpy而不是strcpy是有意义的。然而,strncpy有一个主要的性能问题,因为它 总是 写入为大小指定的字节数。即:
将写入'H'、'e'、'l'、'1'、'o',并用'\0'填充buf的剩余4091个字节。使用strncpy需要注意的另一件事是,如果size参数小于源字符串长度加上其null,则它不会为null终止字符串。例如:
将把'H'、'e'、'l'、'1'、'o'写入buf,并且它不会以null结尾。 |
![]() |
2
2
像 Chris Young mentions ,这些例程不是标准的(或者据我所知,在广泛、常用的情况下),所以我不能100%确定更多的细节,但是:
通常
在我看来,使用
|
![]() |
3
1
|
![]() |
4
0
strncpy和strlcpy之间有一个很大的区别,至少在Theo de Raadt的版本中是这样,你在实现中错过了这个区别。如果给定字符串的长度小于缓冲区大小,则strncpy会用空字节填充缓冲区的其余部分。在许多情况下,这可能只是一个微小的差异,但由于许多c程序员倾向于使用超大缓冲区来确保安全,这可能会产生影响。
将把1021'\0'写入缓冲区,尽管一个就足够了。strlcpy只写入一个“\0”。 |
![]() |
5
0
正如Chris所说,您当前使用的功能是非td的。..更糟糕的是,它们仍然非常低效,仍然容易出错。您可以轻松创建几个使用memcpy/memmove和take(char*)的API,这些API可以在任何地方工作,并且可能比您当前使用的非td.变体更快。 然而,如果你想让别人来做这项繁重的工作,并免费获得安全性/可用性,你可以看看这样的东西 ustr …它易于集成,是std.C,安全、快速,可以处理常量/自动/utf8/动态字符串。还有其他选择。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 6 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 6 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 6 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 6 月前 |