如何strcpy和返回复制的字符数
How to strcpy and return number of copied characters?
我想将一个以null结尾的字符串复制到另一个位置,并想知道复制的字符串有多长。效率至关重要。有一个strcpy
函数可以实现这一点,但它不返回实际复制了多少个字符。
当然,我可以通过稍后简单地调用strlen
来检测复制字符串的长度来找到这一点,但这意味着第二次遍历字符串中的字符,尽管strcpy
无论如何都必须跟踪它复制了多少个字符。出于性能原因,我不希望进行这样的第二次遍历。
我知道用一个简单的逐字符副本编写自己的strcpy
很容易,但我认为标准库可能会应用魔术,使strcpy
比简单的逐个字符实现更快。
那么,对于strcpy
,在不再次遍历字符串的情况下接收复制的字符数的最佳方法是什么?
许多系统支持stpcpy
,它返回指向目的地末尾的指针。您可以减去原始的目标指针,这样就可以得到长度。
我会使用sprintf
来完成这项工作:
size_t len_strcpy(char *dest, char const *src) {
return sprintf("%s", dest, src);
}
不过,很难猜测这是否真的会比使用strcpy
和strlen
慢或快。例如,对于微软编译器,他们最近在sprintf
等的实现方面做了一些工作,因此(在英特尔上)它使用矢量指令,运行速度非常快。使用旧版本的编译器,strcpy
/strlen
获胜的几率会大得多。
如果你真的需要这个,那么写自己的会很容易
unsigned int lenstrcpy(char dest[], const char source[]) {
unsigned int i = 0;
while ((dest[i] = source[i]) != ' ') {
i++;
}
return i;
}
这是一个活生生的例子。
我会尝试使用strlen()
,然后使用memcpy()
,但像往常一样,当速度是你的目标时,你最好针对目标平台进行测试,因为理论上可能有很多因素难以统计。
将memcpy()
添加到Ben的速度测试中
关于gcc 5.1.0与-O1的结果是:
- 第1部分:62181-手册副本
- 第2部分:195093-strcpy/strlen
- 第3部分:45568-strlen/memcpy
第1部分和第3部分的-O2结果几乎没有变化,但第2部分发生了戏剧性的变化:
- 第1部分:62234
- 第2部分:12129
- 第3部分:45565
看起来O2优化编译器消除了对strlen()
的额外调用,并使用了缓存值。
标准C库不提供您想要的函数,因此您需要编写自己的函数。幸运的是,它并不太复杂:
size_t StrCpyLen(char *dest, const char *src) {
const char *s = src;
while ((*dest++ = *s++))
;
return s - src - 1;
}
演示。
上面的实现是从K&R、 有一个小的修改:它不是直接使用src
,而是在运行循环之前进行复制,这样一旦循环完成,就可以通过减去原始src
来确定长度。
- 在这种情况下,我真的复制了字节还是复制了字符?
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 使用动态分配将 char* 复制到另一个字符**
- 库达如何将字符**从内核复制到主机
- 将字符向量复制到另一个向量
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 将字符数组复制到 QByte 数组中,而无需传递指针
- 为什么我的代码在尝试复制字符数组时引发 C6386 错误?
- 使用 strcpy_s 将字符串复制到字符*
- 字符* 复制到另一个字符* 运行时错误
- C 内联汇编试图将STD :: String的字符复制到寄存器中
- 如何将 (ICU4C) Unicode 字符串逐个字符复制到另一个 Unicode 字符串
- 将第一个n个字符复制到std :: string
- 将无符号字符*复制到无符号字符
- 如何在 C++ 中将一些字符复制到字符串中
- 从未签名字符复制到无符号字符
- 您好,我想将一个字符复制到 2D 数组,但第二个字符会擦除第一个字符
- 将分配有 malloc 的字符 * 复制到 std::string
- 如何在c++中进行反向字符复制
- 如何将字符复制到字符数组