2010-01-07 38 views
11

De la manera más simple posible, ¿cómo puedo verificar si un entero inicializado de la función scanf es un número?Compruebe si un valor de scanf es un número?

+1

Creo que esta pregunta responde la tuya. http://stackoverflow.com/questions/456303/how-to-validate-input-using-scanf – hometoast

+0

si un entero es un número? –

+2

Leí la pregunta como "si la cadena leída es un número entero válido". – hometoast

Respuesta

8

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

En caso de éxito, [scanf] devuelve el número de elementos con éxito leer. Este recuento de puede coincidir con el número esperado de lecturas o menos, incluso cero, si ocurre una coincidencia de . En el caso de una falla de entrada antes de que cualquier dato pudiera leerse con éxito, se devuelve EOF .

Por lo que podría hacer algo como esto:

#include <stdio.h> 

int main() 
{ 
    int v; 
    if (scanf("%d", &v) == 1) { 
     printf("OK\n"); 
    } else { 
     printf("Not an integer.\n"); 
    } 
    return 0; 
} 

pero es sugerir que use fgets y strtol lugar.

+0

Gracias, hombre, funciona, pero si pongo esto en un bucle, no funciona correctamente, si la entrada es una cadena al principio, el ciclo es infinito, puedo resolver? – genesisxyz

+0

Puse un getchar(); inside ... funciona ahora – genesisxyz

+1

'sscanf' y' scanf' es una mala idea. Ambos producen un comportamiento indefinido en el desbordamiento. – AnT

6

Su pregunta tiene una redacción extraña. Un número entero inicializado es siempre un número (aparte de los casos exóticos de representaciones de trampas), lo que significa que no hay necesidad de verificar nada.

Supongo que debe comprobar si la cadena dada es una representación válida de un número. Para eso, primero debe definir cómo debería ser la representación válida. ¿Permites signo? ¿Se permite (como un signo) un + redundante? ¿Qué pasa con el prefijo 0x para hexadecimales? Y así.

El lenguaje C ofrece su propio conjunto de reglas que definen la idea del lenguaje de una representación de cadena válida de un entero. Si eso es lo que necesita, entonces para verificar si la cadena dada cumple estas reglas, la mejor manera es usar la función de conversión de cadena a entero como strtol (y otras funciones del grupo strto...) y luego verificar la condición de error.

Tenga cuidado con las respuestas que sugieren escribir su propia función que verificaría estas reglas. Esto simplemente no tiene sentido, ya que la función estándar ya existe. Además, estrictamente hablando, en la programación de la vida real rara vez es necesario realizar la verificación sin la conversión real. strto... hará las dos cosas.

Además, aléjese de las funciones del grupo scanf para realizar una conversión de cadena a entero. Estas funciones producen un comportamiento indefinido en el desbordamiento (es decir, si la representación de la cadena de entrada es demasiado larga). En general, la única forma adecuada de hacer tal conversión en C es funciones del grupo strto....

Cuestiones relacionadas