Я новичок в 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());
}
Вы можете использовать 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;
}
Поскольку конверсия по Фаренгейту в Цельсия (по Цельсию) не упоминается, мы ее проигнорируем.
Как первоначально написано, вопрос, кажется, задает вопрос о строке:
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
,
как я уже сказал в комментарии выше, используйте поплавок для возраста и возраста:
float age, age2;
// do math
cout<<name<<" is "<<age<<" now, and will be " <<age2<<" a year from now.\n";
используйте Qt в качестве C ++ Framework и наслаждайтесь 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;
}