messageBuffer[0] = 1;
messageBuffer[1] = 0;
for (int i = 2; i < (userName.size() + 2); i++)
{
messageBuffer[i] = userName[(i - 2)];
}
userName是一个字符串。我只是想知道是否已经有一个我尚未找到的功能。我试过看cpluscplus,但我没看到。 感谢所有帮助人员=)我真的很感兴趣。这个网站太棒了!
答案 0 :(得分:4)
答案 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]);