2011-01-20 29 views
23

Normalmente cuando escribo algo en C++ y necesito convertir un char en un int, simplemente hago un nuevo int igual al char.Cadena de C++ a doble conversión

que utiliza el código (fragmento)

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

recibo el error que

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

¿Qué significa exactamente el error? La primera palabra es el número 50. Gracias :)

+0

posible duplicado de [cadena en notación científica C++ a doble conversión] (http://stackoverflow.com/questions/1710447/string-in-scientific-notation- c-to-double-conversion) –

+0

Esto es básicamente un duplicado con la única diferencia de que ni siquiera necesita pasar por el escenario de cadena, ya que puede leer directamente en el doble. –

+3

Cuando convierte un 'char' en' int', obtiene el código del personaje, no su "valor" percibido. En otras palabras, 'int x = '0';' establece 'x' a' 48' (si está en una configuración regional compatible con ASCII), no '0'. –

Respuesta

42

Puede convertir char a int y viceversa con facilidad debido a que la máquina un int y un char son las mismas, 8 bits, la única diferencia viene cuando tienen que mostrarse en la pantalla, si el número es 65 y se guarda como un carácter, entonces mostrará 'A', si se guarda como un int, mostrará 65.

Con otros tipos, las cosas cambian, porque se almacenan de manera diferente en la memoria. Hay una función estándar en C que te permite convertir fácilmente de cadena a doble, es un atof. (Es necesario incluir 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; 
} 
14

El problema es que C++ es un lenguaje estáticamente tipado, lo que significa que si algo se declara como string, es una cadena, y si algo se declara como double, es un doble A diferencia de otros lenguajes como JavaScript o PHP, no hay forma de convertir automáticamente de una cadena a un valor numérico porque la conversión podría no estar bien definida. Por ejemplo, si intenta convertir la cadena "Hi there!" a double, no hay una conversión significativa. Claro, usted podría acaba de establecer la double-,0 o NaN, pero esto casi seguro que enmascarar el hecho de que hay un problema en el código.

Para solucionar este problema, no amortiguar el contenido del archivo en una cadena. En cambio, sólo leen directamente en el double:

double lol; 
openfile >> lol; 

Esto lee el valor directamente como un número real, y si se produce un error hará que el método de la corriente .fail() para volver realidad. Por ejemplo:

double lol; 
openfile >> lol; 

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

Si no está leyendo desde una secuencia, necesita usar una función para realizar la conversión, como 'atof()' de ''. –

+4

@Mike: como principiante, cuando no estás leyendo un flujo, pero tienes un hilo, debes ponerlo en un hilo de cadena y leer de eso. – sbi

+0

@Mike, gracias. Eso es lo que necesitaba. – TimeCoder

4

Si está leyendo desde un archivo, entonces debería escuchar el consejo dado y sólo hay que poner en un doble.

Por otro lado, si tiene, por ejemplo, una cadena, puede usar boost lexical_cast.

Aquí es una (muy simple) ejemplo:

int Foo(std::string anInt) 
{ 
    return lexical_cast<int>(anInt); 
} 
-1
#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; 
} 

o

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

Esto no se compila y es muy difícil de leer, no utiliza las características existentes de la biblioteca estándar. Además, la pregunta tiene 2 años y ya ha sido respondida. – unkulunkulu

+1

Esto no compila. Por cierto, pensé que proporcionaría un algoritmo en lugar de las otras respuestas. – ausercomment

+1

La razón por la que no se pudo compilar fue que arg1 en _string_to_double, no se especificó para ser del espacio de nombres std. Está arreglado ahora. – ausercomment

0

Coversion de cadena para duplicar puede lograrse mediante utilizando la función de la biblioteca '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; 
} 
11
#include <iostream> 
#include <string> 
using namespace std; 

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

de salida: 99.999 (que es doble, espacio en blanco fue despojado automáticamente)

Desde el 11 de cadena de la conversión de C++ a valores de coma flotante (como doble) está disponible con funciones:
stof - str convertir a un flotador
stod - str convertir a un doble
stold - str convertir a un largo doble

Como conversión de cadena a int también fue mencionado en la pregunta, existen las siguientes funciones en C++ 11:
stoi - str convertir a un int
stol - str convertir a una larga
stoul - convertir str a un unsigned long
stoll - convertir str a un largo
stoull - convertir str a un largo

0

la forma unsigned long C++ de resolver las conversiones (no el C clásico) se ilustra con el programa a continuación. Tenga en cuenta que la intención es poder utilizar las mismas facilidades de formateo ofrecidas por iostream como precisión, carácter de relleno, relleno, hexadecimal y los manipuladores, etcétera.

Compila y ejecuta este programa, luego estudialo. Es 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. Martínez