如何将 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 样式字符串转换为 c++ 样式字符串

在 C++ 中将字符串转换为 Cstring

如何在 C++11 中将 std::string 转换为 std::u32string?

如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]

将 c 风格的字符串自动解释为 std::string 到 Boost Property tree .get 函数

C++ .NET 将 System::String 转换为 std::string