Строка С++ для двойного преобразования
Обычно, когда я пишу что-нибудь в С++, и мне нужно преобразовать char
в int
, я просто делаю новый int
равным char.
Я использовал код (фрагмент)
string word;
openfile >> word;
double lol=word;
Я получаю сообщение об ошибке
Code1.cpp cannot convert `std::string' to `double' in initialization
Что означает ошибка? Первое слово - это число 50. Спасибо:)
Ответы
Ответ 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
Проблема в том, что С++ - это статически типизированный язык, а это означает, что если что-то объявлено как string
, это строка, и если что-то объявлено как double
, это будет double. В отличие от других языков, таких как JavaScript или PHP, невозможно автоматическое преобразование из строки в числовое значение, потому что преобразование может быть неточным. Например, если вы попытаетесь преобразовать строку "Hi there!"
в double
, никакого значимого преобразования не будет. Конечно, вы можете просто установить double
на 0.0 или NaN, но это почти наверняка будет маскировать тот факт, что в коде есть проблема.
Чтобы исправить это, не буферизируйте содержимое файла в строку. Вместо этого просто прочитайте непосредственно в double
:
double lol;
openfile >> lol;
Это считывает значение непосредственно как действительное число, и если произошла ошибка, метод stream .fail()
возвращает true. Например:
double lol;
openfile >> lol;
if (openfile.fail()) {
cout << "Couldn't read a double from the file." << endl;
}
Ответ 3
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << stod(" 99.999 ") << endl;
}
Вывод: 99.999
(который двойной, пробел был автоматически лишен)
Так как С++ 11 преобразование строки в значения с плавающей запятой (например, double) доступно с функциями:
stof - преобразовать str в float
stod - преобразование str в двойное
stold - преобразовать str в длинный двойной
Так как преобразование строки в int было упомянуто в вопросе, в С++ 11 есть следующие функции:
stoi - преобразовать str в int
stol - преобразовать str в длинный
stoul - преобразовать str в unsigned long
stoll - преобразовать str в длинный длинный
stoull - преобразовать str в unsigned long long
Ответ 4
Если вы читаете файл, вы должны услышать приведенный совет и просто поместить его в двойное.
С другой стороны, если у вас есть, скажем, строка, которую вы можете использовать boost lexical_cast.
Вот пример (очень простой):
int Foo(std::string anInt)
{
return lexical_cast<int>(anInt);
}
Ответ 5
Коррекция из строки в двойную может быть достигнута путем
используя функцию 'strtod()' из библиотеки 'stdlib.h'
#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;
}
Ответ 6
Способ решения конверсий (не классический 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;
}
Prof. Мартинес
Ответ 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;
}