math — преобразование строки в float с помощью atof () в переполнении стека

Я новичок в 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 age\n";
cin>>buf;
age = atof(buf.c_str());
cout<<"Enter your full name please\n";
getline(cin,name);
cout<<"Enter the outside temperature please\n";
cin>>buf;
ftemp=atof(buf.c_str());
cout<<"Enter the current city you are in\n";
cin>>buf;
city=atoi(buf.c_str());
}

0

Решение

Вы можете использовать stringstream для преобразования строки в тип данных, который вы хотите:

#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;
}
1

Другие решения

Поскольку конверсия по Фаренгейту в Цельсия (по Цельсию) не упоминается, мы ее проигнорируем.

Как первоначально написано, вопрос, кажется, задает вопрос о строке:

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

Нам не показывают декларации. На данный момент я предполагаю, что есть предварительная декларация:

double age, age2;

Учитывая это (и не предполагая никаких других манипуляций с age или же age2 до этой строки), настройка age2 в age + 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 в double или же int; Есть лучшие способы сделать эти преобразования как в C, так и в C ++, и механизмы в C ++ отличаются от механизмов в C, особенно когда исходная строка является std::string,

1

  1. как я уже сказал в комментарии выше, используйте поплавок для возраста и возраста:

    float age, age2;
    // do math
    cout<<name<<" is "<<age<<" now, and will be " <<age2<<" a year from now.\n";
    
  2. используйте Qt в качестве C ++ Framework и наслаждайтесь C ++

    QString age("15.5");
    double temp = age.toDouble();
    
0

#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;
}
-2
По вопросам рекламы [email protected]