C ++ строка для двойного преобразования - PullRequest
28 голосов
/ 21 января 2011

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

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

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

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

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

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

Ответы [ 7 ]

53 голосов
/ 21 января 2011

Вы можете легко преобразовать char в int и наоборот, потому что для машины int и char одинаковы, 8 бит, единственное различие возникает, когда они должны отображаться на экране, если число равно 65 и сохраняется каксимвол, тогда он будет показывать 'A', если он будет сохранен как int, он покажет 65.

С другими типами вещи меняются, потому что они по-разному хранятся в памяти.В C есть стандартная функция, которая позволяет легко преобразовывать строки в удвоенные, это 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;
}
27 голосов
/ 12 июня 2015
#include <iostream>
#include <string>
using namespace std;

int main()
{
    cout << stod("  99.999  ") << endl;
}

Вывод: 99.999 (что вдвое больше, пробел был автоматически удален)

Поскольку в C ++ 11 преобразование строки в значения с плавающей точкой (например, double) доступно с функциями:
stof - преобразовать str в число с плавающей точкой
Stod - преобразовать str в двойной
stold - преобразовать str в длинный двойной

Поскольку преобразование строки в int также упоминалось в этом вопросе, в C ++ 11 имеются следующие функции:
стои - преобразовать str в int
stol - преобразовать str в long
stoul - преобразовать str в unsigned long
stoll - преобразовать str в long long
stoull - преобразовать str в длинную строку без знака

14 голосов
/ 21 января 2011

Проблема в том, что C ++ является языком статической типизации. Это означает, что если что-то объявлено как string, это строка, а если что-то объявлено как double, это двойное число. В отличие от других языков, таких как JavaScript или PHP, нет способа автоматически преобразовать строку в числовое значение, поскольку преобразование может быть нечетким. Например, если вы попытаетесь преобразовать строку "Hi there!" в double, значимого преобразования не будет. Конечно, вы могли бы просто установить double в 0.0 или NaN, но это почти наверняка маскирует тот факт, что в коде есть проблема.

Чтобы исправить это, не буферизуйте содержимое файла в строку. Вместо этого просто прочитайте непосредственно в double:

double lol;
openfile >> lol;

Это считывает значение непосредственно как действительное число, и в случае возникновения ошибки метод .fail() потока возвращает значение true. Например:

double lol;
openfile >> lol;

if (openfile.fail()) {
    cout << "Couldn't read a double from the file." << endl;
}
4 голосов
/ 21 января 2011

Если вы читаете из файла, вы должны услышать данный совет и просто поставить его в двойное число.

С другой стороны, если у вас есть, скажем, строка, вы можете использовать boost lexical_cast .

Вот (очень простой) пример:

int Foo(std::string anInt)
{
   return lexical_cast<int>(anInt);
}
1 голос
/ 27 января 2016

Способ решения преобразований на С ++ (не классический С) иллюстрируется программой ниже.Обратите внимание, что цель заключается в том, чтобы иметь возможность использовать те же средства форматирования, которые предлагает 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;
}

Проф.Мартинес

0 голосов
/ 02 мая 2015

Покрытие от струны до двойной может быть достигнуто используя функцию '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;
}
0 голосов
/ 17 апреля 2013
#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;
}
...