如何在C++中将长整型转换为字符串?

78

在C++中,我该如何将long转换为string


5
有点吹毛求疵……我不会称其为“casting”。 - kbyrd
1
@krbyrd,你能告诉我为什么吗?我自己是.NET开发者,C++对我来说仍然感觉不舒服。 :) - Arnis Lapsa
4
同意,这是一次转换而非强制类型转换。 - ralphtheninja
3
我发现人们普遍使用“casting”这个词时往往意思含糊。许多人用它来表示“转换”的意思,但实际上“implicit casts”(隐式转换)这种说法是不存在的:所有的转换都必须是显式的。对我来说,这是一种程序员的无知惹人烦的事情 :) - Johannes Schaub - litb
1
顺便说一句,我现在非常喜欢 JavaScript。事情变化真是奇妙 :) - Arnis Lapsa
显示剩余4条评论
12个回答

100

在 C++11 中,实际上有 <string> 中的 std::to_stringstd::to_wstring 函数。

string to_string(int val);
string to_string(long val);
string to_string(long long val);
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string (long double val);

61

你可以使用stringstream。

#include <sstream>

// ...
std::string number;
std::stringstream strstream;
strstream << 1L;
strstream >> number;

通常在您的编译器标准库中有一些专有的C函数也可以实现。但我更喜欢更“可移植”的变体。

用C的方法是使用sprintf,但这不太安全。在一些库中有新版本,如sprintf_s,可以防止缓冲区溢出。


29

如果你喜欢复制粘贴,这里是:

#include <sstream>

template <class T>
inline std::string to_string (const T& t)
{
    std::stringstream ss;
    ss << t;
    return ss.str();
}

1
您漏掉了 template <typename T> - avakar
这可以讨论,这取决于编译器的实现,模板只有在编译器认为适当的情况下才会被展开内联。 - Gordon Freeman
1
同样适用于内联函数。令人惊讶的是,inline关键字与代码内联几乎没有关系(至少自1998年以来如此)---它只是标记一个函数,以便链接器不会抱怨多个定义。 - avakar

20

C++11中可以使用std::to_string

long val = 12345;
std::string my_val = std::to_string(val);

20

1
+1,尽管最初的lexical_cast除了更具表现力外并没有做更多事情,只是将stringstream例子包装得更好。 - philsquared

13
int main()
{
    long mylong = 123456789;
    string mystring;
    stringstream mystream;
    mystream << mylong;
    mystring = mystream.str();
    cout << mystring << "\n";
    return 0;
}

10
我不知道这是什么样的作业,但很可能老师不想要一个只调用“神奇”的现有函数的答案(尽管这是推荐的方法),而是想看看你是否能自己实现它。
过去,我的老师常说:“我想看看你能不能自己编程,而不是看你能不能在系统中找到它。”嗯,他错了;)
无论如何,如果你的老师也是这样的话,以下是实现方式的 “困难之路”。
std::string LongToString(long value)
{
  std::string output;
  std::string sign;

  if(value < 0)
  {
    sign + "-";
    value = -value;
  }

  while(output.empty() || (value > 0))
  {
    output.push_front(value % 10 + '0')
    value /= 10;
  }

  return sign + output;
}

你可以认为使用std::string不是“困难的方法”,但我想实际算法才是最重要的。

这次使用现成的函数也没问题。但是感谢您提供这个好主意。 - Arnis Lapsa
真的吗?他只是在检查你是否能够在某个地方“找到”一个函数吗?是啊,时代变了 ;) .. - beef2k
@beef2k 更好的是 - 他注意到我懂OOP,感到印象深刻,并且不再检查其他任何东西。 :) - Arnis Lapsa
@Blindy,以下是一些半随机链接,以便您更清楚地了解我的知识 - http://pastebin.com/k4YAqUXy - Arnis Lapsa
与使用 std::stringstream 的其他解决方案相比,这种方法不会更快吗? - Atul

5

1
是的。这至少是我在SO上链接它的第三次了。8v) - Fred Larson

4
   #include <sstream>


   ....

    std::stringstream ss;
    ss << a_long_int;  // or any other type
    std::string result=ss.str();   // use .str() to get a string back

1
它是std::string,而不是std::String。 - avakar

2

看看 std::stringstream


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接