将字符串转换为 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&
,而不是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::string
的 c_str()
成员函数返回一个 const char*
(又名 C 样式字符串)。
std::string str = "world";
printf("hello, %s", str.c_str());
【讨论】:
以上是关于将字符串转换为 C 样式字符串的主要内容,如果未能解决你的问题,请参考以下文章
Arduino:将字符串十六进制“#FFFFFF”转换为 3 int