【问题标题】:C++ string to double conversionC++字符串到双重转换
【发布时间】:2011-06-12 20:17:44
【问题描述】:

通常当我用 C++ 编写任何东西并且我需要将 char 转换为 int 时,我只需创建一个新的 int 等于 char。

我使用了代码(sn-p)

 string word;  
 openfile >> word;
 double lol=word;

我收到的错误是

Code1.cpp cannot convert `std::string' to `double' in initialization 

错误的确切含义是什么?第一个词是数字 50。谢谢 :)

【问题讨论】:

  • 这基本上是一个副本,唯一的区别是您甚至不需要经过字符串阶段,因为您可以直接读入双精度。
  • 当您将char 转换为int 时,您得到的是角色的代码,而不是其感知的“价值”。换句话说,int x = '0';x 设置为 48(如果您使用 ASCII 兼容的语言环境),而不是 0
  • 不是那个副本。说真的@jb.,再次String->DoubleDouble->String 不一样。

标签: c++ string file double


【解决方案1】:

您可以轻松地将 char 转换为 int,反之亦然,因为对于机器而言,int 和 char 是相同的,都是 8 位,唯一的区别是它们必须显示在屏幕上,如果数字是 65 并保存为一个char,那么它会显示'A',如果它保存为一个int,它会显示65。

对于其他类型,事情会发生变化,因为它们在内存中的存储方式不同。 C中有一个标准函数可以让你轻松地从字符串转换为double,它是atof。 (你需要包含stdlib.h)

#include <stdlib.h>

int main()
{
    string word;  
    openfile >> word;
    double lol = atof(word.c_str()); /*c_str is needed to convert string to const char*
                                     previously (the function requires it)*/
    return 0;
}

【讨论】:

    【解决方案2】:
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        cout << stod("  99.999  ") << endl;
    }
    

    输出:99.999(双精度,空格被自动去除)

    从 C++11 开始,将字符串转换为浮点值(如 double)可用于以下函数:
    stof - 将 str 转换为 float
    stod - 将 str 转换为 double
    stold - 将 str 转换为 long double

    由于问题中还提到了将字符串转换为 int,因此 C++11 中有以下函数:
    stoi - 将 str 转换为 int
    stol - 将 str 转换为long
    stoul - 将 str 转换为 unsigned long
    stoll - 将 str 转换为 long long
    stoull - 将 str 转换为 unsigned long long

    【讨论】:

      【解决方案3】:

      问题在于 C++ 是一种静态类型的语言,这意味着如果某个东西被声明为 string,那么它就是一个字符串,如果某个东西被声明为 double,那么它就是一个双精度数。与 JavaScript 或 PHP 等其他语言不同,无法自动从字符串转换为数值,因为转换可能没有明确定义。例如,如果您尝试将字符串"Hi there!" 转换为double,则没有有意义的转换。当然,您可以double 设置为 0.0 或 NaN,但这几乎肯定会掩盖代码中存在问题的事实。

      要解决此问题,请不要将文件内容缓冲到字符串中。而是直接读入double

      double lol;
      openfile >> lol;
      

      这会将值直接读取为实数,如果发生错误将导致流的.fail()方法返回true。例如:

      double lol;
      openfile >> lol;
      
      if (openfile.fail()) {
          cout << "Couldn't read a double from the file." << endl;
      }
      

      【讨论】:

      • 如果不是从流中读取,则需要使用函数来执行转换,例如atof() from &lt;stdlib.h&gt;
      • @Mike:作为初学者,当您不是从流中读取,而是有一个字符串时,您需要将其放入一个字符串流中并从中读取。
      【解决方案4】:

      如果您正在从文件中读取,那么您应该听取给出的建议并将其放入双重文件中。

      另一方面,如果你确实有一个字符串,你可以使用 boost 的lexical_cast

      这是一个(非常简单的)示例:

      int Foo(std::string anInt)
      {
         return lexical_cast<int>(anInt);
      }
      

      【讨论】:

        【解决方案5】:

        下面的程序说明了解决转换的 C++ 方法(不是经典的 C)。请注意,其目的是能够使用 iostream 提供的相同格式化工具,例如精度、填充字符、填充、十六进制和操纵器等。

        编译并运行这个程序,然后研究它。很简单

        #include "iostream"
        #include "iomanip"
        #include "sstream"
        using namespace std;
        
        int main()
        {
            // Converting the content of a char array or a string to a double variable
            double d;
            string S;
            S = "4.5";
            istringstream(S) >> d;    
            cout << "\nThe value of the double variable d is " << d << endl;
            istringstream("9.87654") >> d;  
            cout << "\nNow the value of the double variable d is " << d << endl;
        
        
        
            // Converting a double to string with formatting restrictions
            double D=3.771234567;
        
            ostringstream Q;
            Q.fill('#');
            Q << "<<<" << setprecision(6) << setw(20) << D << ">>>";
            S = Q.str(); // formatted converted double is now in string 
        
            cout << "\nThe value of the string variable S is " << S << endl;
            return 0;
        }
        

        教授。马丁内斯

        【讨论】:

        • 使用&lt;&gt; 引用系统/编译器头文件,因为它们就是这样的文件。否则,编译器将首先查找本地编译目录以及由-I 标志设置的包含目录。
        【解决方案6】:

        从 string 到 double 的转换可以通过 使用库“stdlib.h”中的“strtod()”函数

        #include <iostream>
        #include <stdlib.h>
        int main () 
        {
            std::string data="20.9";
            double value = strtod(data.c_str(), NULL);
            std::cout<<value<<'\n';
            return 0;
        }
        

        【讨论】:

        • 在 C++ 中有一个名为 nullptr 的类型化空值,它是 C++11 标准附带的。
        【解决方案7】:
        #include <string>
        #include <cmath>
        double _string_to_double(std::string s,unsigned short radix){
        double n = 0;
        for (unsigned short x = s.size(), y = 0;x>0;)
        if(!(s[--x] ^ '.')) // if is equal
        n/=pow(10,s.size()-1-x), y+= s.size()-x;
        else
            n+=( (s[x]-48) * pow(10,s.size()-1-x - y) );
        return n;
        }
        

        //In case you want to convert from different bases.
        #include <string>
        #include <iostream>
        #include <cmath>
        double _string_to_double(std::string s,unsigned short radix){
        double n = 0;
        for (unsigned short x = s.size(), y = 0;x>0;)
        if(!(s[--x] ^ '.'))
        n/=pow(radix,s.size()-1-x), y+= s.size()-x;
        else
            n+=( (s[x]- (s[x]<='9' ? '0':'0'+7)   ) * pow(radix,s.size()-1-x - y) );
        return n;
        }
        int main(){
        std::cout<<_string_to_double("10.A",16)<<std::endl;//Prints 16.625
        std::cout<<_string_to_double("1001.1",2)<<std::endl;//Prints 9.5
        std::cout<<_string_to_double("123.4",10)<<std::endl;//Prints 123.4
        return 0;
        }
        

        【讨论】:

        • 这不编译并且很难阅读,不使用标准库的现有功能。此外,这个问题已有 2 年历史,并且已经得到解答。
        • 这确实可以编译。顺便说一句,我想我会提供一种算法,而不是其他答案。
        • 无法编译的原因是 _string_to_double 中的 arg1 未指定为命名空间 std。现在已经修复了。
        • 其他问题依然存在:没有缩进,流不清晰,间距完全不一致,名称以下划线开头。我对这个算法没有信心。这不是算法问题。
        • 这不是关于生活讨论的观点。事实上,这根本不是一个讨论,这个网站更有经验的用户告诉你,这里更欢迎什么样的答案,就是这样。很少有人会尝试挖掘代码,其作者没有努力使其可读。
        猜你喜欢
        • 2013-02-25
        • 2014-06-20
        • 2018-06-04
        • 1970-01-01
        • 2015-12-26
        • 2015-08-06
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多