Подтвердить что ты не робот

Строка С++ для двойного преобразования

Обычно, когда я пишу что-нибудь в С++, и мне нужно преобразовать char в int, я просто делаю новый int равным char.

Я использовал код (фрагмент)

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

Я получаю сообщение об ошибке

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

Что означает ошибка? Первое слово - это число 50. Спасибо:)

4b9b3361

Ответ 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;
}