【问题标题】:C++ converting an int to a stringC++ 将 int 转换为字符串
【发布时间】:2013-03-13 02:30:15
【问题描述】:

我知道这是非常基本的,但我对 C++ 很陌生,似乎找不到答案。我只是想将一些整数转换为字符串。此方法有效:

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

但是当我需要像这样转换第二个和第三个时:

int b = 13;
stringstream ss;
ss << a;
string str2 = ss.str();

int c = 15;
stringstream ss;
ss << b;
string str3 = ss.str();

我收到此错误:

'std::stringstream ss' previously declared here

我需要以某种方式关闭字符串流吗?我注意到,如果我在代码中将它们彼此远离,编译器不会介意,但这似乎不是我应该做的事情。有人有建议吗?

【问题讨论】:

  • 您使用 stringstream 只是为了将 int 转换为字符串?您应该尝试改用 std::to_string。
  • 是的。我试过 to_string 并且我的编译器不理解它。我收到此错误:无法解析函数“to_string”。我确保我也在使用 #include 和 #include
  • 将字符串标头添加到您的代码中。请参阅下面的示例
  • 试试 std::to_string(int),它会正常工作的。
  • to_string 是较新 C++ 版本的属性。许多编译器不会理解它。

标签: string int


【解决方案1】:

您正试图用相同的名称重新声明相同的字符串流。您可以像这样修改您的代码以便工作:

 int b = 13;
stringstream ss2;
ss2 << a;
string str2 = ss2.str();

如果你不想重新声明,也可以这样:

int b = 13;
ss.str(""); // empty the stringstream
ss.clear();
ss << a;
string str2 = ss.str();

你也可以使用,速度更快:

int c = 42;
std::string s = std::to_string(c);

【讨论】:

  • @JavaRunner,还有什么不使用std::to_string的理由吗?我现在考虑用to_string 替换用于一个值的stringstreams,但不确定,这是个好主意。
【解决方案2】:

stringstream 和其他变量一样是一个变量。为了使成语可以重复使用而无需更改,请将其放在大括号中:

int a = 13;
string str2;
{
    stringstream ss;
    ss << a;
    str2 = ss.str();
} // ss ceases to exist at the closing brace

int b = 15;
string str3;
{
    stringstream ss; // now we can make a new ss
    ss << b;
    str3 = ss.str();
}

从C++11开始就可以了

std::string str4 = std::to_string( b );

或(带有任意类型的c)

std::string str5 = ( std::stringstream() << c ).str();

当然还有其他解决方案。

【讨论】:

  • 感谢您提供的信息。当我这样做时,我没有收到任何错误,但是当我稍后在我的代码中尝试使用括号外的字符串时,它说它们没有在这个范围内定义。我想我解决了我的问题,我只想为每个字符串流使用不同的名称。
  • @user2162870 请注意我是如何在大括号之外声明字符串的。此外,您可能会考虑将其分解为函数。 (您甚至可以调用函数 to_string 来简化最终向 C++11 的迁移。)复制粘贴代码更难维护。
  • ( std::stringstream() &lt;&lt; b ).str() 成语是如何工作的?据我所知,&lt;&lt; 返回一个ostream&amp;,它没有str()。
  • @TrygveFlathen 在 C++11 之前,std::stringstream() &lt;&lt; b 会将流作为不接受临时值的 std::ostream &amp; 左值引用。当右值引用被添加到语言中时,一个通用重载被添加到库中,所以我应该更新答案。
【解决方案3】:

您遇到的特定错误是告诉您不能在同一范围内声明两个具有相同名称(在您的情况下为ss)的变量。

如果您想创建一个新的stringstream,您可以将其命名为其他名称。

但是还有其他方法可以将 int 转换为字符串。您可以使用 std::to_string()。

【讨论】:

    【解决方案4】:

    试试

    #include <string>
    
    int a = 10;
    std::string s = std::to_string(a);
    

    【讨论】:

    • 我试过 to_string 并且我的编译器不理解它。我收到此错误:无法解析函数“to_string”。我确保我也在使用 #include 和 #include
    • 你的开发环境是什么?
    • 我确实有 #include 语句。我在 macOS 上使用 Eclipse。
    • 查看这篇 SO 帖子:stackoverflow.com/questions/7905025/… ...但听起来您的路径可能设置不正确。
    【解决方案5】:

    确保您声明:

    using namespace std;
    

    然后插入代码:

    int a = 10;
    ostringstream ssa;
    ssa << a;
    string str = ssa.str();
    
    int b = 13;
    ostringstream ssb;
    ssb << b;
    string str2 = ssb.str();
    
    int c = 15;
    ostringstream ssc;
    ssc << c;
    string str3 = ssc.str();
    

    【讨论】:

      【解决方案6】:

      我能想到的最简单的方法之一是:

      string str = string(itoa(num));
      

      【讨论】:

        猜你喜欢
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        相关资源
        最近更新 更多