我正在尝试将 int 转换为 cstring。我决定通过 stringstream 将 int 读入常规字符串,然后将字符串读入 char 数组。以下似乎正在工作,但我想知道我是否只是对我的编译器感到幸运。代码看起来不错吗?谢谢!
int zip = 1234;
char zipString[30];
stringstream str;
str << zip;
str >> zipString;
cout << zipString;
std::string
您可以从流的函数中获取 C++ str()
,并从字符串的c_str()
函数中获取不可变的 C 风格以零结尾的字符串:
std::string cpp_string = str.str();
char const * c_string = cpp_string.c_str();
您可能想将这些组合成一个表达式,str.str().c_str()
但这是错误的;在您可以对指针执行任何操作之前,C++ 字符串将被销毁。
只要您确定缓冲区足够大,您正在做的事情就会起作用;但是使用 C++ 字符串消除了溢出缓冲区的危险。一般来说,最好避免使用 C 风格的字符串,除非您需要使用需要它们的 API(或者,在极端情况下,作为避免内存分配的优化)。std::string
通常更安全,更容易使用。
除非您有特定原因需要 char 数组而不是标准字符串,否则我会使用后者。尽管在这种情况下并非绝对必要,但我通常也会使用 Boostlexical_cast
而不是通过字符串流显式移动内容来进行转换:
std::string zipString = lexical_cast<std::string>(zip);
然后,如果您确实需要将结果作为 c 风格的字符串,您可以使用zipString.c_str()
它来获取它(尽管它在一种方式上仍然不同——您不能修改返回的内容)。
在这种特定情况下,它不会为您带来很多好处,但在此一般订单上持续使用转换会增加,如果您要这样做,您也可以在这里使用它。
的成员函数返回一个(又名 C 风格的字符串)std::string
。c_str()
const char*
std::string str = "world";
printf("hello, %s", str.c_str());