将字符串转换为 C 样式字符串

Posted

技术标签:

【中文标题】将字符串转换为 C 样式字符串【英文标题】:Converting string to C style string 【发布时间】:2012-06-29 14:52:02 【问题描述】:

我正在尝试将 int 转换为 cstring。我决定通过 stringstream 将 int 读入常规字符串,然后将字符串读入 char 数组。以下似乎正在工作,但我想知道我是否只是对我的编译器感到幸运。代码看起来不错吗?谢谢!

int zip = 1234;    

char zipString[30];

stringstream str;

str << zip;

str >> zipString;

cout << zipString;

【问题讨论】:

最好将此问题移至codereview.stackexchange.com 有什么理由需要将字符串作为 c 字符串而不是 std::string?后者通常是一个更好的选择,除非你被遗留代码束缚住了。 我需要独立处理字符串中的每个“整数”。似乎一个数组可以让我以最简单的顺序挑选它们。 @IniquiTrance: std::string 也可以像数组一样被索引。 【参考方案1】:

您可以从流的 str() 函数中获得 C++ std::string,并从字符串的 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 通常更安全、更易于使用。

【讨论】:

谢谢!出于好奇,你会建议不要做我所做的事情吗? 你是对的!我以为stringstream.str() 返回了std::string&amp;,而不是std::string :) @IniquiTrance:一般来说,我建议对字符串使用std::string,除非有令人信服的理由使用其他东西。【参考方案2】:

除非您有特定原因需要 char 数组而不是标准字符串,否则我会使用后者。尽管在这种情况下并非绝对必要,但我通常也会使用 Boost lexical_cast 而不是通过字符串流显式移动内容来进行转换:

std::string zipString = lexical_cast<std::string>(zip);

然后,如果您确实需要将结果作为 c 样式的字符串,您可以使用 zipString.c_str() 来获得它(尽管它在某一方面仍然不同——您无法修改返回的内容)。

在这种特定情况下,它不会为您带来很多好处,但在此一般订单上持续使用转化会增加,如果您要这样做,您也可以在这里使用它。

【讨论】:

你获得了快速失败的行为,这很多。我从未见过整个组织始终如一地检查流的失败位(包括@IniquiTrance)。【参考方案3】:

std::stringc_str() 成员函数返回一个 const char*(又名 C 样式字符串)。

std::string str = "world";
printf("hello, %s", str.c_str());

【讨论】:

以上是关于将字符串转换为 C 样式字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 C 风格的字符串转换为 C++ std::string

将包含转义字符的字符串转换为dict

Arduino:将字符串十六进制“#FFFFFF”转换为 3 int

将字符串转换为驼峰格式

PHP 将PHP date()样式dateFormat转换为等效的jQuery UI datepicker字符串

将PHP date()样式的dateFormat转换为等效的jQuery UI datepicker字符串