2010-02-08 16 views
6

Estoy tratando de analizar un valor de argumento en C y convertir el número a un valor doble. Tengo:C análisis doble de cadenas de argumentos

char *stringEnd; double num = strtod("123.0", &stringEnd);

utilicé 123,0 sólo para probar la función, pero siempre devuelve un valor de 0,0. ¿Alguien sabe lo que estoy haciendo mal?

+1

esto se ve bien, debe estar en otro lugar. tal vez nos muestre más código? –

+0

No se olvide de la administración de la memoria en stringEnd, en este momento, apunta a cualquier valor que tenga la memoria. –

Respuesta

7

¿Está incluido el encabezado relevante? es decir: #include <stdlib.h>

Primero (aunque deberías estar haciendo esto todo el tiempo), intenta compilar con todas las advertencias activadas (-Wall en GCC).

Si recibe una advertencia sobre strtod siendo indefinido, que muestra dónde está el problema está viniendo.

Este es un desagradable, porque C declarará implícitamente cualquier función que no tiene un prototipo de como un entero de retorno!

+0

hmm, ¿por qué el voto a favor? Estoy bastante seguro de que esta es la respuesta correcta. Oh bien. –

+1

No del todo: implícitamente lo toma como devolver un int, no 0. Pero usted está haciendo la misma pregunta que yo ... –

+1

Implícitamente * declara * it como return int. La definición no es implícita: en realidad está llamando a la función de la biblioteca, la definición correcta con la declaración incorrecta. Por lo tanto, busca en el lugar incorrecto el valor de retorno, un registro entero en lugar de un registro FP. – Potatoswatter

1

Puede utilizar sscanf.

double num; 
sscanf("123.0", "%lf", &num); 
+0

A menos que intente analizar múltiples elementos de una cadena, no hay beneficio de usar 'sscanf' sobre' strtod'. Es más complicado y tiene el inconveniente de dificultar la detección de datos mal formados. – jamesdlin

1

Usted si tiene que utilizar strtod que puede hacer:

double num = strtod("123.0",NULL); 

también puede utilizar sscanf

double num;  
sscanf("123.0","%lf",&num); 
+0

-1.Está repitiendo su código, excepto que no permite una forma de detectar errores (para eso es el segundo parámetro para strtod) y repite exactamente una respuesta anterior (aunque solo por 2 minutos). –

1

Es necesario incluir stdlib.h

0

En qué idioma es tu sistema operativo? No estoy seguro de cómo reacciona la función C, pero sé que la función delphi equivalente tiene en cuenta la configuración del sistema operativo. Algunos idiomas (francés, alemán, ...) usan un "," en lugar de un "." como separador decimal.