web-dev-qa-db-fra.com

Chaîne C ++ à double conversion

Habituellement, lorsque j'écris quelque chose en C++ et que je dois convertir un char en un int, je crée simplement un nouveau int égal au caractère.

J'ai utilisé le code (extrait)

 string Word;  
 openfile >> Word;
 double lol=Word;

Je reçois l'erreur

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

Qu'est-ce que l'erreur signifie exactement? Le premier mot est le numéro 50. Merci :)

30
TimeCoder

Vous pouvez facilement convertir char en int et vice-versa car, pour la machine, int et char sont identiques, 8 bits. La seule différence est qu'ils doivent être affichés à l'écran, si le nombre est 65 et est enregistré en tant que char alors il affichera 'A', s'il est enregistré en tant qu'int, il affichera 65.

Avec les autres types, les choses changent, car elles sont stockées différemment dans la mémoire. Il existe une fonction standard en C qui vous permet de convertir une chaîne en double facilement, c’est atof. (Vous devez inclure 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;
}
52
0x77D
#include <iostream>
#include <string>
using namespace std;

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

Sortie: 99.999 _ (qui est double, les espaces sont automatiquement supprimés)

Depuis C++ 11, la conversion de chaîne en valeurs à virgule flottante (comme double) est disponible avec les fonctions suivantes:
stof - convertir str en float
stod - convertir str en double
stold - convertir str en long double

Comme la conversion de string en int était également mentionnée dans la question, les fonctions suivantes sont disponibles dans C++ 11:
stoi - convertir str en int
stol - convertit str en long
stoul - convertit str en long non signé
stoll - convertit str en un long long
stoull - convertit str en un long unsigned long

28
Bad

Le problème est que C++ est un langage de type statique, ce qui signifie que si quelque chose est déclaré en tant que string, c'est une chaîne, et si quelque chose est déclaré en tant que double, c'est un double. Contrairement à d'autres langages tels que JavaScript ou PHP, il n'existe aucun moyen de convertir automatiquement une chaîne en valeur numérique, car la conversion risque de ne pas être bien définie. Par exemple, si vous essayez de convertir la chaîne "Hi there!" En double, il n'y a pas de conversion significative. Bien sûr, vous pourriez définissez simplement double sur 0.0 ou NaN, mais cela masquerait certainement le fait qu’il existe un problème dans le code.

Pour résoudre ce problème, ne mettez pas le contenu du fichier sous forme de tampon dans une chaîne. Au lieu de cela, il suffit de lire directement dans le double:

double lol;
openfile >> lol;

Cela lit directement la valeur sous forme de nombre réel et, si une erreur se produit, la méthode .fail() du flux renvoie true. Par exemple:

double lol;
openfile >> lol;

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

Si vous lisez un fichier, écoutez les conseils donnés et mettez-les simplement en double.

Par contre, si vous avez une chaîne, par exemple, vous pouvez utiliser le boost lexical_cast .

Voici un exemple (très simple):

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

La façon de résoudre les conversions en C++ (pas le C classique) est illustrée avec le programme ci-dessous. Notez que l'intention est de pouvoir utiliser les mêmes fonctionnalités de formatage offertes par iostream, telles que la précision, le caractère de remplissage, le remplissage, l'hex et les manipulateurs, etc.

Compilez et exécutez ce programme, puis étudiez-le. C'est simple

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

Martinez

1
Rodolfo Martinez

La conversion de chaîne en double peut être réalisée en utilisant la fonction 'strtok ()' de la bibliothèque '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
EleetGeek