如何将 std::string 转换为 C 风格的字符串 [重复]
Posted
技术标签:
【中文标题】如何将 std::string 转换为 C 风格的字符串 [重复]【英文标题】:How to convert an std::string to C-style string [duplicate] 【发布时间】:2012-06-13 01:53:57 【问题描述】:我正在使用 C++ 编程。
这个问题很基本,我似乎无法在任何地方找到答案。那么问题来了:
我想创建一个 C 风格的字符串,但是我想将一个整数变量 i 放入字符串中。所以很自然地,我使用了一个流:
stringstream foo;
foo
<< "blah blah blah blah... i = "
<< i
<< " blah blah... ";
但是,我需要以某种方式获取 C 风格的字符串以传递给函数(结果 foo.str() 返回一个 std::string)。所以这在技术上是一个由三部分组成的问题——
1) 如何将 std::string 转换为 C 风格的字符串?
2) 有没有办法从字符串流中获取 C 风格的字符串?
3)有没有办法直接使用C风格的字符串(不使用stringstreams)来构造一个包含整数变量的字符串?
【问题讨论】:
最简单的方法是使用流创建一个itos
函数,然后使用itos (564).c_str()
,函数返回foo.str()
。
sprintf()
和 buffer-overflow-safe snprintf()
将填充您指定格式的 cstring。
【参考方案1】:
1) 如何将 std::string 转换为 C 风格的字符串?
只需致电string.c_str()
即可获得char const*
。如果您需要 可变 _C-style_ 字符串,请复制一份。只要你不调用string
的任何non-const函数,返回的C字符串都是有效的。
2) 有没有办法从字符串流中获取 C 风格的字符串?
有,只是strstream.str().c_str()
。返回的 C 字符串 仅在包含它的表达式结束之前有效,这意味着将其用作函数参数是有效的,但不能存储在变量中以供以后访问。
3)有没有办法直接使用C风格的字符串(不使用stringstreams)来构造一个包含整数变量的字符串?
还有C方式,使用sprintf
之类的。
【讨论】:
【参考方案2】:你已经成功了一半。你需要foo.str().c_str();
your_string.c-str()
-- 但这并没有真正转换,它只是为您提供一个指向缓冲区的指针,该缓冲区(临时)保存与字符串相同的内容。
是的,以上,foo.str().c_str()
。
是的,但通常最好避免此类事情。你基本上会陷入“真正的程序员可以用任何语言编写 C”的陷阱。
【讨论】:
我听说过关于 FORTRAN 的笑话,但从什么时候开始抨击 C :-(. @jedwards:我一点也不在抨击 C —— 但我认为最好选择其中一个,而不是写一些 C++ 并混入非 C++ 习语。【参考方案3】:这真的很简单
#include <afx.h>
std::string s("Hello");
CString cs(s.c_str());
没有
你可以使用sprintf来格式化一个c风格的字符串
【讨论】:
以上是关于如何将 std::string 转换为 C 风格的字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++11 中将 std::string 转换为 std::u32string?
如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]