¿Cómo verificar si la entrada del usuario es un número flotante en C?

4 minutos de lectura

Estoy tratando de crear un programa que verifique si el número que ingresa el usuario es flotante, pero no funciona. Traté de consultar con scanfpero eso tampoco funcionó.

#include <stdio.h>

int main(void) {

        float num1;

        printf("enter number: ");
        scanf("%lf", &num1);



        if (scanf("%lf")) {

                printf("Good \n");
        }
        else {
                printf("Bad \n");
        }
}

  • ¿Qué significa “entrar en un flotador”? (Los usuarios en realidad no ingresan flotantes; los usuarios ingresan secuencias de caracteres)

    – usuario253751

    10 de noviembre de 2015 a las 2:17

  • scanf es bastante peligroso. Es un grave riesgo de seguridad en C (desbordamiento de búfer, cualquiera) y realmente debería retirarse. Use getline para obtener el número como una cadena y escriba una función para probar y ver si es un número de punto flotante válido.

    – ncmathsadist

    10 de noviembre de 2015 a las 2:18

  • El uso de @ncmathsadist OP de scanf() no se desbordará. getline() no es C estándar, aunque el código fuente está fácilmente disponible. Estar de acuerdo scanf() se retire la fuente.

    – chux – Reincorporar a Monica

    10 de noviembre de 2015 a las 15:26

  • nunca escuché que scanf es peligroso

    – Juan

    4 de noviembre de 2020 a las 19:29

¿Como verificar si la entrada del usuario es un numero
Iharob Al Asimi

¿Ha leído alguna documentación sobre scanf(3)?

Necesita verificar el valor de retorno de esta manera

double value;
if (scanf("%lf", &value) == 1)
    printf("It's float: %f\n", value);
else
    printf("It's NOT float ... \n");

Hay una forma que prefiero porque da más control sobre la entrada posterior, scanf() rara vez es realmente útil. En su lugar, intente fgets()

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    char buffer[100];
    double value;
    char *endptr;
    if (fgets(buffer, sizeof(buffer) stdin) == NULL)
        return -1; /* Unexpected error */
    value = strtod(buffer, &endptr);
    if ((*endptr == '\0') || (isspace(*endptr) != 0))
        printf("It's float: %f\n", value);
    else
        printf("It's NOT float ...\n");
} 

  • Es posible que desee observar cómo el valor de retorno indica el número de asignaciones correctas y que un valor de retorno de 1 no siempre es equivalente al éxito. Mi $0.02.

    – Nube

    10 de noviembre de 2015 a las 2:26

  • Necesito comprobar if (*endptr == buffer) de lo contrario, no se produjo ninguna conversión. if (*endptr == '\0') normalmente falla como *endptr –> \n. La segunda mitad necesita trabajo.

    – chux – Reincorporar a Monica

    10 de noviembre de 2015 a las 2:26

  • @Dogbert Estoy tan cansado de escribir sobre eso en SO que dejé el enlace para que el lector pueda averiguarlo.

    – Iharob Al Asimi

    10 de noviembre de 2015 a las 12:41

¿Como verificar si la entrada del usuario es un numero
chux – Reincorporar a Monica

La mejor manera de probar si una cadena se convierte en un double es usar strtod().

strtod() puede ser complicado de usar. Con strtod(char *s, char *endptr)si s == endptr, La conversión falló. De lo contrario, verifique la cadena que comienza en endptr por ofender a los personajes.

Los problemas de desbordamiento/desbordamiento no se abordan aquí más que para decir strtod() y conversión a float se convertirá fácilmente a cero o infinito, ambos típicamente representables como un float.

#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>

bool is_float(const char *s, float *dest) {
  if (s == NULL) {
    return false;
  }
  char *endptr;
  *dest = (float) strtod(s, &endptr);
  if (s == endptr) {
    return false; // no conversion;
  }
  // Look at trailing text
  while (isspace((unsigned char ) *endptr))
    endptr++;
  return *endptr == '\0';
}

void is_float_test(const char *s) {
  float x;
  printf("Test(\"%s\"):\n", s ? s : "NULL");
  if (is_float(s, &x)) {
    printf("Good (float) %e\n", x);
  } else {
    puts("Bad (float)");
  }
}

int main(void) {
  // Test cases
  is_float_test("123");
  is_float_test(" 123");
  is_float_test("123.456\n");
  is_float_test("123  ");
  is_float_test("123e123");
  is_float_test("123e456");
  is_float_test("  123 xyz");
  is_float_test("  abc");
  is_float_test(" ");
  is_float_test("");

  // Chance for user input
  char buffer[80];
  is_float_test(fgets(buffer, sizeof buffer, stdin));
  return 0;
}

Producción

Test("123"):
Good (float) 1.230000e+02
Test(" 123"):
Good (float) 1.230000e+02
Test("123.456
"):
Good (float) 1.234560e+02
Test("123  "):
Good (float) 1.230000e+02
Test("123e123"):
Good (float) inf
Test("123e456"):
Good (float) inf
Test("  123 xyz"):
Bad (float)
Test("  abc"):
Bad (float)
Test(" "):
Bad (float)
Test(""):
Bad (float)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad