CB *_*ley 42
这正是std::string复制功能的作用.
#include <string>
#include <iostream>
int main()
{
char test[5];
std::string str( "Hello, world" );
str.copy(test, 5);
std::cout.write(test, 5);
std::cout.put('\n');
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果你需要null终止,你应该这样做:
str.copy(test, 4);
test[4] = '\0';
Run Code Online (Sandbox Code Playgroud)
Jer*_*fin 21
首先,strncpy几乎肯定不是你想要的.strncpy是为了相当特定的目的而设计的.它几乎完全在标准库中,因为它已经存在,而不是因为它通常是有用的.
做你想做的最简单的方法可能就是:
sprintf(buffer, "%.4s", your_string.c_str());
Run Code Online (Sandbox Code Playgroud)
与strncpy此不同,这可以保证结果将终止NUL,但如果源短于指定值,则不会在目标中填充额外数据(尽管后者在目标长度为5时不是主要问题).
使用功能 如果您的实现提供了一个(目标网站上没有的功能),则链接断开,目标网站上找不到该材料(但该功能不在标准C库中),但它被广泛接受作为"安全"有限长度复制功能的事实上的标准名称对于零终止字符串.strlcpy
如果您的实现没有提供strlcpy功能,请自己实现.例如,像这样的东西可能适合你
char *my_strlcpy(char *dst, const char *src, size_t n)
{
assert(dst != NULL && src != NULL);
if (n > 0)
{
char *pd;
const char *ps;
for (--n, pd = dst, ps = src; n > 0 && *ps != '\0'; --n, ++pd, ++ps)
*pd = *ps;
*pd = '\0';
}
return dst;
}
Run Code Online (Sandbox Code Playgroud)
(实际上,事实上接受了strlcpy回报size_t,因此您可能更愿意实施已接受的规范,而不是我上面所做的那样).
请注意推荐strncpy用于此目的的答案.strncpy不是一个安全的有限长度字符串复制功能,不应该用于此目的.虽然你可以强行strncpy为此目的"工作",但它仍然类似于用锤子驱动木螺钉.
| 归档时间: |
|
| 查看次数: |
89676 次 |
| 最近记录: |