44 votes

Conversion d'une chaîne de caractères C++ en double

Habituellement, lorsque j'écris quelque chose en C++ et que j'ai besoin de convertir un fichier char dans un int Je crée simplement un nouveau int égale à l'omble.

J'ai utilisé le code (extrait)

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

Je reçois l'erreur suivante

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

Que signifie exactement l'erreur ? Le premier mot est le nombre 50. Merci :)

74voto

0x77D Points 1304

Vous pouvez convertir un char en int et vice-versa facilement car pour la machine, un int et un char sont identiques, 8 bits, la seule différence vient du fait qu'ils doivent être affichés à l'écran, si le nombre est 65 et qu'il est sauvegardé en tant que char, alors il affichera 'A', s'il est sauvegardé en tant que 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 facilement une chaîne de caractères en un double, 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;
}

67voto

Bad Points 2339
#include <iostream>
#include <string>
using namespace std;

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

Sortie : 99.999 (qui est double, les espaces ont été automatiquement supprimés)

Depuis C++11, la conversion de chaînes de caractères en valeurs à virgule flottante (comme le double) est disponible avec les fonctions :
stof - convertir str en float
stod - convertir str en un double
stable - convertir str en un long double

Comme la conversion de chaînes de caractères en int a également été mentionnée dans la question, il existe les fonctions suivantes dans C++11 :
stoi - convertir str en int
stol - convertir str en un long
stoul - convertir str en un unsigned long
stoll - convertir str en un long long
stoulet - convertir str en un unsigned long long

17voto

templatetypedef Points 129554

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

Pour résoudre ce problème, ne mettez pas en mémoire tampon le contenu du fichier dans une chaîne de caractères. Au lieu de cela, lisez directement dans le fichier double :

double lol;
openfile >> lol;

Cette méthode lit directement la valeur comme un nombre réel, et si une erreur se produit, elle provoquera l'utilisation de la fonction .fail() pour qu'elle renvoie vrai. Par exemple :

double lol;
openfile >> lol;

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

4voto

MatiasFG Points 182

Si vous lisez un fichier, vous devriez écouter les conseils donnés et le mettre en double.

D'un autre côté, si vous avez, disons, une chaîne de caractères, vous pouvez utiliser la fonction de boost lexical_cast .

Voici un exemple (très simple) :

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

1voto

La manière C++ de résoudre les conversions (et non le C classique) est illustrée par le programme ci-dessous. Notez que l'intention est de pouvoir utiliser les mêmes facilités de formatage offertes par iostream comme la précision, le caractère de remplissage, le padding, l'hexagone, et les manipulateurs, etcetera.

Compilez et exécutez ce programme, puis étudiez-le. Il 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;
}

Prof. Martinez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X