es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir el valor de una cadena de caracteres a tipo de dato double sin utilizar la función atof.

Me quedé atascado con la función double asciitofloat. Mi función debería recibir una cadena de caracteres y devolver el valor como un double. No se me permite usar atof().

Quiero buscar un punto en la cadena, para probar si es un double. Si no lo es, debería devolver -1.

double ascii_to_float(char *textzahl)
{
  int x;
  double ausgabe;

  sprintf(ausgabe,"%s",textzahl);

  /*con -=48, no estoy seguro de cómo codificarlo correctamente,
  solo sé que tengo que disminuir con 48.*/

  for(x=0; x< strlen(textzahl); x++) 
  {
      if(textzahl[x]=='.')
      {
         textzahl[x]-=48; 
      }
      else
      {
          textzahl[x]=-1;
      }
  }

  return ausgabe;
}

La función principal está dada, así que solo tengo que escribir el código de la función anterior.

“`
#include <stdio.h>
#include <string.h>

int main()
{
char text[80];
double zahl2;

<pre><code>printf("\n Bitte eine Zahl eingeben: ");
fgets(text, sizeof(text), stdin);
zahl2 = ascii_to_float(text);

if (zahl2 == -1.0)
{
printf("\nFehlerhafte Eingabe oder Wert -1.");
}
else
{
printf("\nDie Zahl2 lautet: %lf\n",zahl2);
}
</code></pre>

}
“`</string.h></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado para la función ascii_to_float.

    En primer lugar, se utiliza la función sprintf para copiar la cadena textzahl en la variable ausgabe, pero sprintf se utiliza para formatear una cadena y escribirla en un búfer, no para copiar una cadena. Para copiar una cadena, en su lugar se deben utilizar strcpy o memcpy.

    En segundo lugar, el bucle que busca el punto decimal ('.') y convierte los caracteres de dígitos en números no funciona correctamente. Restar 48 del código de carácter se hace para convertir el código ASCII del carácter de dígito al número correspondiente, pero no tiene sentido restar 48 del código de carácter del punto decimal. Además, establecer textzahl[x] en -1 simplemente reemplaza el carácter con un carácter no imprimible, lo que no logra nada útil.

    Aquí hay una implementación corregida para ascii_to_float:

    double ascii_to_float(const char *textzahl)
    {
        double ausgabe = 0.0;
        int seen_dot = 0;
        double scale = 1.0;
    
        for (int i = 0; textzahl[i]; i++) {
            if (textzahl[i] == '.') {
                if (seen_dot) {
                    // Segundo punto decimal, no es un double válido
                    return -1.0;
                }
                seen_dot = 1;
            } else if (textzahl[i] >= '0' && textzahl[i] <= '9') {
                if (seen_dot) {
                    scale /= 10.0;
                }
                ausgabe = ausgabe * 10.0 + (textzahl[i] - '0') * scale;
            } else {
                // Carácter no válido, no es un double válido
                return -1.0;
            }
        }
    
        if (!seen_dot) {
            // Sin punto decimal, no es un double válido
            return -1.0;
        }
    
        return ausgabe;
    }
    

    Esta implementación utiliza un bucle para iterar sobre los caracteres en la cadena de entrada textzahl, manteniendo un registro de si se ha visto un punto decimal (seen_dot), un factor de escala (scale) que se utiliza para ubicar correctamente el punto decimal en el double resultante, y una suma acumulativa (ausgabe) que acumula el valor numérico de la cadena de entrada.

    El bucle verifica cada carácter a su vez y maneja un dígito (actualizando ausgabe y scale), un punto decimal (marcándolo como visto) o un carácter no válido (devolviendo -1.0 para indicar fallo).

    Al final del bucle, verificamos si se vio un punto decimal (seen_dot), y devolvemos -1.0 si no lo fue, ya que eso significa que la cadena de entrada no es un double válido. Si pasamos el bucle sin problemas, devolvemos ausgabe, que contiene el valor double correcto.

Comments are closed.