我已经做了一些基本的阅读,并从我收集到的内容.c_str()始终有一个空终止符。
我有一个相当简单的C ++程序:
int main(int argc, char** argv)
{
std::string from = "hello";
char to[20];
memcpy(to, from.c_str(), strlen(from.c_str())+1);
std::cout<< to << std::endl;
return 0;
}
memcpy是否会确保我将以空字符结尾的字符串复制到我的变量中(假设我的字符串来自长度较短)?
答案 0 :(得分:4)
您应该使用std::string
复制字符串。但是,如果你想这样做,你应该使用strcpy
而不是memcpy
int main(int argc, char** argv)
{
std::string from = "hello";
char to[20];
strcpy(to, from.c_str());
std::cout<< to << std::endl;
return 0;
}
答案 1 :(得分:3)
memcpy
不知道字符串是什么。你给它一个范围来复制。这取决于strlen
这里提供范围的终止点
答案 2 :(得分:2)
是的,只要from
中的字符串短于20,这就会起作用。哦,不,等等,我们也在复制NULL终结符,所以它必须短于19.我猜你看到了这会导致一些混乱。
顺便说一下这个代码很危险的原因:我假设这是演示代码,你的实际代码将从某种输入中获取该字符串。那一刻你将无法控制它的持续时间。您可以截断它,但您可能忘记这样做,这意味着您的程序将内容复制到可能不属于它的内存。这可能会导致崩溃,但至少会导致未定义的行为,因为您覆盖了可能包含其他重要数据的内存。
使用string
类实际上有助于避免此类问题,而无需指定字符串长度。我建议使用这个类,只在绝对必要时才进行涉及c_str()
的操作。
答案 3 :(得分:0)
您的问题的答案是“是”(只要您的char数组足够大,您应该进行验证步骤。)
如果你真的想这样做,你可以这样做:
int main(int argc, char** argv)
{
std::string from = "hello";
char* to = new char[from.length() + 1];
memcpy(to, from.c_str(), from.length() + 1 );
std::cout<< to << std::endl;
delete[] to;
return 0;
}
只要您不将另一个较长的字符串写入“to”
,哪个更安全