有没有更好的方法将字符串复制到包含已有内容的字符数组中

时间:2009-11-10 07:44:31

标签: c++

messageBuffer[0] = 1;
messageBuffer[1] = 0;
for (int i = 2; i < (userName.size() + 2); i++)
{
    messageBuffer[i] = userName[(i - 2)];
}

userName是一个字符串。我只是想知道是否已经有一个我尚未找到的功能。我试过看cpluscplus,但我没看到。 感谢所有帮助人员=)我真的很感兴趣。这个网站太棒了!

11 个答案:

答案 0 :(得分:4)

strncpy

编辑:请参阅@jaif answer获取“C ++”方式。

答案 1 :(得分:4)

标准不保证C ++字符串是连续的,这意味着到目前为止使用strncpy的所有建议都是不安全的(如果它们从&userName[0]复制或可能效率低(如果它们从{{复制) 1}},这可能意味着不必要的副本)

正确的 C ++ 解决方案是使用userName.c_str()。快速安全。

std::copy

作为一般规则,如果你发现自己在C ++程序中乱搞 C字符串函数你做错了

答案 2 :(得分:3)

strcpy(messageBuffer + 2, userName.c_str());

关于确保有足够内存的标准免责声明

messageBuffer应该比字符串大3个字符(一个用于\0

关于函数here

的一些参考

答案 3 :(得分:3)

使用strcpy并手动检查缓冲区大小。

strncpy有点安全,但在其他方面很危险。如果缓冲区太小,strncpy不会终止带有\0的字符串,这将导致程序中的其他位置出错。

如果要使用strncpy,请务必验证输出是否为\ 0终止。通常当人们使用strncpy时,他们会忘记这样做,这就是我推荐strcpy的原因。使用strcpy时,C和C ++程序员通常可以发现丢失的缓冲区大小检查。

答案 4 :(得分:2)

是的,您可以使用strcpy,memcpy,memmove或std :: copy来执行此操作。只需传递messageBuffer [2]的地址作为目的地。 strcpy( &messageBuffer[2], userName.begin() );

答案 5 :(得分:2)

如果可能,请使用std :: vector和std :: copy

std::vector<char> messageBuffer;
messageBuffer.reserve(userName.size() + 2); // optional
messageBuffer.push_back(1);
messageBuffer.push_back(0);
std::copy(userName.begin(), userName.end(), std::back_inserter(messageBuffer));
theC_API(&messageBuffer[0]);

也许不是最快的,但没有误算的可能性。

答案 6 :(得分:1)

使用strncpy

答案 7 :(得分:1)

对ANSI字符串(char *)使用strncpy(),对Unicode(wchar_t *)字符串使用wcsncpy()。

答案 8 :(得分:1)

您有两种选择,不安全和安全的方式。

不安全:

// bad idea, string lengths are not checked and if src is longer than 
// memory available for dest, you will stomp over random memory
strcpy(dest, src);

更安全的:

// Much safer, you can specify how many characters to copy (lesser of src length and
// dest length - 1 and add a null terminator '\0' to dest if the string was truncated).
strncpy(dest, src, num_characters);

答案 9 :(得分:0)

使用strcpy(或strncpy来防止缓冲区溢出)怎么样? 确保messageBuffer的长度允许复制userName并且只有strcpy(messageBuffer + 2, userName);

答案 10 :(得分:0)

使用vector更好的方法是

std::vector<char> messageBuffer;
messageBuffer.resize(userName.size()+2);
strcpy(&messageBuffer[0],usernamr.c_str());
std::copy(userName.begin(), userName.end(), std::back_inserter(messageBuffer));
theC_API(&messageBuffer[0]);