如何将std::stringa 转换为a char*或a const char*?
在C++中,11 basic_string::c_str被定义为完全相同basic_string::data,而后者又定义为*(begin() + n)和*(&*begin() + n)(when 0 <= n < size())完全相同.
我找不到任何要求字符串在其末尾始终具有空字符的内容.
这是否意味着c_str()不再保证生成以null结尾的字符串?
我应该在这个问题前面说我认为答案可能不是,但我想看看其他人对这个问题的看法.
我花了大部分时间编写与Win32 API交互的C++,就像大多数C风格API想要的那样:
这两种情况本质上都意味着如果你想std::string在你的代码中使用,你必须接受这样一个事实,即你每次std::string从临时缓冲区构造一个字符串时都会进行大量的字符串复制.
什么会很好:
std::string并预先保留其分配并提前设置其大小(以缓解方案1)std::string现有的char[](以缓解方案2)有没有一种很好的方法来做其中任何一种,或者我应该接受使用std::string旧学校API 的固有成本?看起来情况1看起来特别棘手,因为它std::string有一个短的字符串优化,因此它的缓冲区可以在堆栈或堆上,具体取决于它的大小.
所以我有一个std::string并且有一个函数可以接受char*并写入它.既然std::string::c_str()又std::string::data()回来了const char*,我不能用它们.所以我分配了一个临时缓冲区,用它调用一个函数并将其复制到std::string.
现在我计划处理大量信息,复制这个缓冲区会产生明显的影响,我想避免它.
有人建议使用&str.front()或&str[0]但是它会调用未定义的行为吗?
我以前从未见过这个函数的调用char()。这是在哪里描述的,它是什么意思?此用法是此 cppreference.com 社区 wiki 页面上示例的一部分:https://en.cppreference.com/w/cpp/string/basic_string/resize:
short_string.resize( desired_length + 3 );
std::cout << "6. After: \"";
for (char c : short_string) {
std::cout << (c == char() ? '@' : c); // <=== HERE ===
}
Run Code Online (Sandbox Code Playgroud)
描述中的措辞对我来说也没有任何意义,我不明白它在说什么:
将附加字符初始化为
CharT().
在上下文中突出显示:
std::string::resize()方法的原因是尝试学习如何预先分配 astd::string以便在 C 函数调用中用作缓冲区char*。这可以通过首先std::string调用my_string.resize()函数来预分配 来实现。然后,您可以安全地&my_string[0]作为标准char*写入索引my_string.size() - 1。也可以看看: