如何将std::string转换为C风格字符串

4
我正在使用C++编程。
虽然这个问题很基础,但我似乎无法在任何地方找到答案。所以这就是问题:
我想创建一个 C 风格的字符串,但我想把一个整数变量 i 放进字符串中。因此,我自然而然地使用了流:
stringstream foo;
foo
                << "blah blah blah blah... i = " 
                << i
                << " blah blah... ";

然而,我需要以某种方式获得一个C风格的字符串以传递给函数(结果证明foo.str()返回一个std :: string)。因此,这在技术上是一个三部分问题--

1)如何将std :: string转换为C风格的字符串?

2)有没有一种方法可以从stringstream中获取C风格的字符串?

3)是否有一种方法可以直接使用C风格的字符串(而不使用stringstreams)来构造一个带有整数变量的字符串?


1
最简单的方法是使用流制作 itos 函数,并使用 itos(564).c_str(),其中函数返回 foo.str() - chris
1
sprintf() 和安全的缓冲区溢出函数 snprintf() 将按照您指定的格式填充 C 字符串。 - jedwards
3个回答

14

1) 如何将 std::string 转换为 C 风格字符串?

只需调用 string.c_str() 即可获得一个 char const*。如果需要一个可变的 _C 风格_ 字符串,则需要复制一份。返回的 C 字符串 有效期限取决于你是否调用了 string 的任何 非常量 函数。

2) 有没有一种方法可以从 stringstream 中获取 C 风格字符串?

有的,只需使用 strstream.str().c_str() 即可。返回的 C 字符串 只在包含它的表达式结束之前有效,这意味着可以将其用作函数参数,但不能将其存储在变量中以供稍后访问。

3) 有没有一种不使用 stringstream 的方法,直接使用 C 风格字符串来构造一个包含整数变量的字符串?

C 方式,使用 sprintf 等函数。


3

你已经完成了一半。你需要使用 foo.str().c_str();

  1. your_string.c-str() -- 但这并不真正转换字符串,它只是给你一个指向缓冲区的指针,该缓冲区(暂时)保存与字符串相同的内容。
  2. 是的,在上面,foo.str().c_str()
  3. 是的,但你通常最好避免这样做。你基本上会陷入“真正的程序员可以在任何语言中编写C”的陷阱。

我听过关于FORTRAN的笑话,但是从什么时候开始嘲弄C语言变得时髦了 :-(。 - jedwards
@jedwards:我并不是在抨击C语言 - 但我认为最好选择其中一种,而不是写一些带有明显非C++习惯用法的C++代码片段。 - Jerry Coffin

-1
  1. 这真的很简单

    #include <afx.h>
    std::string s("Hello");
    CString cs(s.c_str());
    
  2. 你可以使用sprintf来格式化C风格的字符串


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接