【问题标题】:Converting string to C style string将字符串转换为 C 样式字符串
【发布时间】: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 也可以像数组一样被索引。

标签: c++ string cstring


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

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 2011-02-03
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多