在 C++ 中使用 atof() 将字符串转换为浮点数

Converting string to float with atof() in C++

本文关键字:字符串 转换 浮点数 C++ atof      更新时间:2023-10-16

我是C++新手,我需要帮助将字符串变量转换为数字。我需要在屏幕上打印这个人的年龄和她的下一岁,但我不知道怎么做。我不能用字符串做数学。所以你能给我举几个例子吗?

我尝试这样做:

  //converts F to C
  ctemp=(ftemp-32)*5.0/9.0;
  //calculates age
  age2 = age + 1 ; age2 = atof (age2.c_str()); age = atof (age.c_str());

  cout<<name<<" is "<<age<<" now, and will be " <<age2<<" a year from now.n"<<"Its "<<ftemp<<" in "<<city<<"--- That's "<<setprecision(2)<<ctemp<<" degrees C"<<endl;

编辑:

int main() { 
    int city; 
    double ftemp, ctemp,age,age2;
    string buf,name; //Ask user to enter age, name, temperature and city 
    cout<<"Enter your agen"; 
    cin>>buf; 
    age = atof(buf.c_str()); 
    cout<<"Enter your full name pleasen"; 
    getline(cin,name); 
    cout<<"Enter the outside temperature pleasen"; 
    cin>>buf; 
    ftemp=atof(buf.c_str()); 
    cout<<"Enter the current city you are inn"; 
    cin>>buf; 
    city=atoi(buf.c_str());
}

您可以使用字符串流将字符串转换为所需的数据类型:

#include <sstream>
#include <string>
#include <iostream>
int main() {
  std::string num_str = "10.5";
  std::istringstream iss(num_str);
  float f_val = 0;
  iss >> f_val;
  //this will output 10.5 (as expected)
  std::cout << f_val << std::endl;
  return 0;
}

这会将f_val分配给字符串的值。

此方法是首选方法,因为它具有内置的转换检查,并且可以处理任何基本C++类型。因此,如果可以创建一个模板函数来为您执行检查并返回所需类型的特定值:

#include <sstream>
#include <iostream>
#include <string>
#include <stdexcept>
template<typename T>
T ConvertStringToNumber(const std::string& str)  
{  
  std::istringstream ss(str);  
  T number = 0;  
  ss >> number;  
  if (ss.fail( )) 
  {
    throw std::invalid_argument("ConvertStringToNumber:" + str);
  }
   return number;  
}
int main(int argc, char argv[]){
  std::string num_str = "10.5";
  float f = ConvertStringToNumber<float>(num_str);
  std::cout << f << std::endl;
  return 0;
}

由于没有提到华氏度到摄氏度(摄氏度(的转换,我们将忽略它。

正如最初所写,问题似乎是在问这行:

age2 = age + 1 ; age2 = atof (age2.c_str()); age = atof (age.c_str());

我们没有看到声明。 目前,我假设有一个预先声明:

double age, age2;

鉴于此(并假设在此行之前没有对ageage2进行其他操作(,将age2设置为 age + 1 会将 1 添加到未定义的值并将其存储在 age2 中。 然后存储的值被分配转换的结果...等等,你在开玩笑...将age2转换为 C 字符串并将atof()应用于结果的结果。 所以,也许我对age2的假设类型是错误的——它真的很std::string? 但是,如果age2是一个字符串,那么您在之前的赋值中遇到了问题,并且此age2 = atof(age2.c_str());赋值也不起作用。 类似的问题适用于age = atof(age.c_str());分配。 逻辑应该是"分配给age; age2 = age + 1;'。

str:string s_age = "21";
double age = atof(s_age.c_str());
double age2 = age + 1;
std::cout << "Age: " << age << ", Next year: " << age2 << endl;

想想测序。 考虑类型。 当您下次提出问题时,请显示类型! 查找创建 SSCCE(简短、自包含、正确的示例(所需的条件,并在可能的情况下将问题中的代码设为 SSCCE。

我回避讨论atof()(或问题标题中最初提到的atoi(),但在问题正文中没有再次提及(是否是将 C 字符串转换为doubleint的好方法; 有更好的方法可以在 C 和 C++ 中进行这些转换, 并且C++中的机制与 C 中的机制不同,尤其是当源字符串是std::string时。

  1. 正如我在上面的评论中所说,使用浮点数表示年龄和年龄:

    float age, age2;
    // do math
    cout<<name<<" is "<<age<<" now, and will be " <<age2<<" a year from now.n";
    
  2. 使用Qt作为您的C++框架并享受C++

    QString age("15.5");
    double temp = age.toDouble();
    
#include "iostream.h"
main() {
    float a,b,rmvivek,arni;
    char ch="123.00"; 
    a=atof(ch);
    arni=a+2*5;
    cout  << "the a value is" << arni;
}