C++ string naar dubbele conversie

Meestal als ik iets in C++ schrijf en ik moet een charconverteren naar een int, maak ik gewoon een nieuwe intgelijk aan de char.

Ik heb de code(snippet)

. gebruikt

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

Ik krijg de foutmelding dat

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

Wat betekent de fout precies? Het eerste woord is het getal 50. Bedankt 🙂


Antwoord 1, autoriteit 100%

Je kunt char gemakkelijk converteren naar int en omgekeerd omdat voor de machine een int en een char hetzelfde zijn, 8 bits, het enige verschil komt wanneer ze in het scherm moeten worden weergegeven, als het nummer 65 is en wordt opgeslagen als een char, dan zal het ‘A’ tonen, als het is opgeslagen als een int zal het 65 tonen.

Bij andere typen veranderen dingen, omdat ze anders in het geheugen worden opgeslagen. Er is een standaardfunctie in C waarmee je gemakkelijk van string naar dubbel kunt converteren, het is atof. (U moet stdlib.h opnemen)

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

Antwoord 2, autoriteit 76%

#include <iostream>
#include <string>
using namespace std;
int main()
{
    cout << stod("  99.999  ") << endl;
}

Uitvoer: 99.999(wat dubbel is, witruimte werd automatisch verwijderd)

Sinds C++11 is het converteren van tekenreeksen naar waarden met drijvende komma (zoals dubbel) beschikbaar met functies:
stof– converteer str naar een float
stod– converteer str naar een dubbele
stold– converteer str naar een lange double

Omdat conversie van string naar int ook in de vraag werd genoemd, zijn er de volgende functies in C++11:
stoi– converteer str naar een int
stol– converteer str naar een lange
stoul– converteer str naar een niet-ondertekende lange
stoll– converteer str naar een lange lange
stoull– converteer str naar een niet-ondertekende lange lange


Antwoord 3, autoriteit 24%

Het probleem is dat C++ een statisch getypeerde taal is, wat betekent dat als iets wordt gedeclareerd als een string, het een string is, en als iets wordt gedeclareerd als een double, het is een dubbele. In tegenstelling tot andere talen zoals JavaScript of PHP, is er geen manier om automatisch van een tekenreeks naar een numerieke waarde te converteren, omdat de conversie mogelijk niet goed gedefinieerd is. Als u bijvoorbeeld de tekenreeks "Hi there!"probeert te converteren naar een double, is er geen zinvolle conversie. Natuurlijk, je zoude doublegewoon op 0.0 of NaN kunnen zetten, maar dit zou vrijwel zeker het feit maskeren dat er een probleem in de code zit.

Om dit op te lossen, moet u de bestandsinhoud niet bufferen in een string. Lees in plaats daarvan rechtstreeks in de double:

double lol;
openfile >> lol;

Dit leest de waarde direct als een reëel getal, en als er een fout optreedt, zal de .fail()-methode van de stream true retourneren. Bijvoorbeeld:

double lol;
openfile >> lol;
if (openfile.fail()) {
    cout << "Couldn't read a double from the file." << endl;
}

Antwoord 4, autoriteit 6%

Als je uit een bestand aan het lezen bent, zou je het gegeven advies moeten horen en het gewoon in een dubbel moeten zetten.

Aan de andere kant, als je bijvoorbeeld een string hebt, zou je boost’s lexical_cast.

Hier is een (heel eenvoudig) voorbeeld:

int Foo(std::string anInt)
{
   return lexical_cast<int>(anInt);
}

Antwoord 5

De C++ manier om conversies op te lossen (niet de klassieke C) wordt geïllustreerd met het onderstaande programma. Houd er rekening mee dat het de bedoeling is om dezelfde opmaakfaciliteiten te kunnen gebruiken die worden aangeboden door iostream, zoals precisie, opvulteken, opvulling, hex en de manipulators, enzovoort.

Compileer en voer dit programma uit en bestudeer het dan. Het is eenvoudig

#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. Martinez


Antwoord 6

Coversie van string naar double kan worden bereikt door
met de functie ‘strtod()’ uit de bibliotheek ‘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;
}

Antwoord 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;
}

of

//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;
}

Other episodes