¿Comprobar si un valor de scanf es un número?

De la forma más sencilla posible, ¿cómo puedo verificar si un número entero inicializado desde la función scanf es un número?

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

En caso de éxito, [scanf] devuelve la cantidad de elementos leídos correctamente. Este recuento puede coincidir con el número esperado de lecturas o menos, incluso cero, si se produce una falla coincidente. En el caso de una falla de entrada antes de que cualquier dato pueda ser leído exitosamente, se devuelve EOF.

Así que podrías hacer algo como esto:

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

Pero se sugiere que uses fgets y strtol en su lugar.

Tu pregunta está extrañamente redactada. Un entero inicializado siempre es 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 debe ser la representación válida. ¿Permites firmar? ¿Se permite un redundante + (como signo)? ¿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, para verificar si la cadena dada cumple con 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 si condición de error.

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

Además, manténgase alejado de las funciones del grupo scanf para realizar la 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 el caso general, la única forma correcta de realizar dicha conversión en C es mediante las funciones de strto... group.