【问题标题】:How do I convert a long to a string in C++?如何在 C++ 中将 long 转换为字符串?
【发布时间】:2010-10-31 03:54:35
【问题描述】:

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

【问题讨论】:

  • 只是有点吹毛求疵...我不会称之为“铸造”。
  • @krbyrd 你能告诉我为什么吗?我自己是一个 .NETist,c++ 仍然让我感到不舒服。 :)
  • 同意,这是转换而不是演员表。
  • 我发现“casting”这个词通常被重载了。人们在他们想说“转换”的任何地方使用它。诸如“隐式转换”之类的东西不存在:转换总是显式的。这对我来说是一种程序员无知的小毛病:)
  • @litb 还有一件事——英语不是我的母语。我经常混淆相似词的确切含义。

标签: c++


【解决方案1】:

在C++11中,中其实有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);

【讨论】:

    【解决方案2】:

    你可以使用字符串流。

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

    标准库中通常有一些专有的 C 函数供您的编译器执行。不过,我更喜欢更“便携”的变体。

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

    【讨论】:

      【解决方案3】:

      如果你喜欢复制粘贴,那就是:

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

      【讨论】:

      • 你错过了template &lt;typename T&gt;
      • 可以讨论,这取决于编译器的实现,模板只有在编译器认为合适的时候才会内联扩展
      • 内联函数也是如此。令人惊讶的是,inline 关键字与代码内联几乎没有关系(至少从 1998 年开始)——它只是标记一个函数,以便链接器不会抱怨多个定义。
      【解决方案4】:

      boost::lexical_cast&lt;std::string&gt;(my_long) 更多这里http://www.boost.org/doc/libs/1_39_0/libs/conversion/lexical_cast.htm

      【讨论】:

      • +1,虽然最初,lexical_cast 所做的只是被接受的字符串流示例(只是更富有表现力地结束了)。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:
        int main()
        {
            long mylong = 123456789;
            string mystring;
            stringstream mystream;
            mystream << mylong;
            mystring = mystream.str();
            cout << mystring << "\n";
            return 0;
        }
        

        【讨论】:

          【解决方案7】:

          我不知道这是什么作业,但很可能老师不想要一个你只调用“神奇”现有函数的答案(即使这是推荐的方法),但他想看看能不能自己实现。

          以前,我的老师常说“我想看看你能不能自己编程,而不是你能不能在系统里找到它。”好吧,他错了;)..

          无论如何,如果你的老师是一样的,这是困难的方法..

          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 并不是“困难的方式”,但我猜在实际算法中什么才是重要的。

          【讨论】:

          • 这个时候用ready函数就好了。但是感谢这个巧妙的想法。
          • 真的吗?他只是在检查你是否可以在某处find 一个函数?是的,时代变了;)..
          • @beef2k 更好 - 他注意到我知道 OOP,感觉印象深刻并且不检查其他任何内容。 :)
          • @Blindy 这里有一些半随机链接,以防你想更清楚地了解我所知道的 - pastebin.com/k4YAqUXy
          • 与使用std::stringstream 的其他解决方案相比,它不会更快吗?
          【解决方案8】:

          有几种方法。阅读The String Formatters of Manor Farm 进行深入比较。

          【讨论】:

          • 是的。这至少是我第三次在 SO 上链接它。 8v)
          【解决方案9】:
             #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
          

          【讨论】:

          • 这是 std::string,而不是 std::String。
          【解决方案10】:

          查看std::stringstream

          【讨论】:

            【解决方案11】:

            到目前为止,任何人都没有涵盖的一件事是,为了帮助您进一步思考问题,将它转换为字符串时应该采用什么格式。

            看看一个电子表格程序(如 Calc/Excel)。您是否希望它四舍五入到最接近的百万,如果它是负数则使用括号,始终显示符号....这个数字是否真的代表其他东西,您应该用 Oractal 还是 Hex 显示它?

            到目前为止的答案已经为您提供了一些默认输出,但可能不是正确的。

            【讨论】:

            • 喜欢它,我对这个问题给出了一个深思熟虑的答案,以帮助思考家庭作业,而不是给出已经存在的答案,我得到了一个反对票,同时 'std::stringstream' 有一个赞成票...
            【解决方案12】:

            我通常使用 sprintf 执行此操作。因此,假设您使用的是 32 位架构,那么很长一段时间您都可以执行以下操作:

            char buf[5] = {0}; // one extra byte for null    
            sprintf(buf, "%l", var_for_long);
            

            【讨论】:

            • -1。虽然 C++ 编译器会编译您的代码,但它当然不应该被称为 C++。此外,我怀疑 5 个字符是否足够。
            • 请不要在这个时代提倡 sprintf。我们没有足够的缓冲区溢出漏洞吗?并不是说这段代码看起来像写的那样——但你永远不知道事情是如何变化的。
            • 菲尔,超过 10000 的任何数字,缓冲区都会溢出。
            • avakar - 你是绝对正确的 :-s 这会教我在从酒吧回家的路上向 SO 发帖。
            • 我同意 printf 系列存在一些危险,但我认为我们无法逃避它们。在一个完美的世界中,我们可以忽略它们,但我在使用它们的 c++ 代码库中工作,很高兴知道它们是如何/为什么是危险的。每当您进行低级系统编程时,您都会遇到这些调用。诚然,我的例子不是最好的,但现在它记录了为什么它不好,其他人可以从中学习。在内部,我们使用 asprintf 和 vasprintf 来防止缓冲区溢出。
            猜你喜欢
            • 1970-01-01
            • 2020-12-02
            • 1970-01-01
            • 1970-01-01
            • 2016-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多