【问题标题】:How to convert an std::string to C-style string [duplicate]如何将 std::string 转换为 C 风格的字符串 [重复]
【发布时间】: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。

标签: c++ string cstring stdstring


【解决方案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();

    1. your_string.c-str() -- 但这并没有真正转换,它只是为您提供一个指向缓冲区的指针,该缓冲区(临时)保存与字符串相同的内容。
    2. 是的,以上,foo.str().c_str()
    3. 是的,但通常最好避免此类事情。你基本上会陷入“真正的程序员可以用任何语言编写 C”的陷阱。

    【讨论】:

    • 我听说过关于 FORTRAN 的笑话,但从什么时候开始抨击 C :-(.
    • @jedwards:我一点也不在抨击 C —— 但我认为最好选择其中一个,而不是写一些 C++ 并混入非 C++ 习语。
    【解决方案3】:
    1. 这真的很简单

      #include <afx.h>
      std::string s("Hello");
      CString cs(s.c_str());
      
    2. 没有

    3. 你可以使用sprintf来格式化一个c风格的字符串

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2021-10-26
      • 1970-01-01
      • 2019-05-29
      • 2018-09-23
      • 1970-01-01
      相关资源
      最近更新 更多