C++ memcpy to char* from c_str
C++ memcpy to char* from c_str
我已经做了一些基本的阅读,从我收集到的内容来看。c_str()总是有一个null终止符。
我有一个相当简单的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会确保我将一个以null结尾的字符串复制到我的变量to(前提是我的字符串from的长度更短)吗?
您应该使用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;
}
memcpy
不知道什么是字符串。你给它一个可以复制的范围。它取决于这里的strlen
来提供范围的终止点
是的,只要from
中的字符串短于20,这就可以工作。哦,不,等等,我们也在复制NULL终止符,所以它必须短于19。我想你知道这会导致一些混乱。
这正是这个代码危险的原因:我假设这是演示代码,而你的实际代码将从某种输入中获得字符串。在那一刻,你将无法控制它的长度。你可以截断它,但你可能会忘记这样做,这意味着你的程序将把内容复制到可能不属于它的内存中。这可能会导致崩溃,但至少会导致未定义的行为,因为你正在覆盖可能包含其他重要数据的内存。
使用string
类实际上有助于避免此类问题,因为不必指定字符串长度。我建议使用这个类,并且只在绝对必要的时候执行涉及c_str()
的操作。
您的问题的答案是"是";(只要您的char数组足够大,就应该执行验证步骤)。
如果你真的想这样做,你可以做:
int main(int argc, char** argv)
{
std::string from = "hello";
char* to = new char[from.length() + 1];
strcpy(to, from.c_str()); ///Or memcpy(to, from.c_str(), from.length() + 1 );
std::cout<< to << std::endl;
delete[] to;
return 0;
}
只要你不把另一个更长的字符串写进";至";
相关文章:
- 如何解决"invalid conversion from 'char' to 'const char*'"
- Python str to C++ to Python str
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 解释一下 for (char c : str) 的作用?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- std::async from std::async in windows xp
- Getline(cin,str)的奇怪输出
- std::is_reference from std::any
- 比使用 s.str().c_str() 更好的表达?
- 除以 str.length() 什么也没显示
- std::time_point from and to std::string
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- std::chrono::time_point from std::string
- Visual accept std::string from std::byte iterator
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- C++中链表的错误"Abort signal from abort(3) (sigabrt) "
- C6001:使用单元化内存"str[i]"