strtonum parse ejemplo convert c stdio

parse - strtol c ejemplo



¿Cómo obtener int desde stdio en C? (3)

La forma típica es con scanf :

int input_value; scanf("%d", &input_value);

Tener problemas significativos con esto ...

printf("> "); int x = getchar(); printf("got the number: %d", scanf("%d", &x));

salida

> 1234 got the number: 1


La solución es bastante simple ... estás leyendo getchar (), que te da el primer carácter en el búfer de entrada, y scanf simplemente lo analizó (realmente no sé por qué) a un entero, si olvidas el getchar para un segundo, leerá el búfer completo hasta un carácter de nueva línea.

printf("> "); int x; scanf("%d", &x); printf("got the number: %d", x);

Salidas

> [prompt expecting input, lets write:] 1234 [Enter] got the number: 1234


No estoy completamente seguro de que esto es lo que está buscando, pero si su pregunta es cómo leer un entero usando <stdio.h> , entonces la sintaxis correcta es

int myInt; scanf("%d", &myInt);

Tendrá que hacer un montón de manejo de errores para asegurarse de que esto funcione correctamente, por supuesto, pero este debería ser un buen comienzo. En particular, tendrá que manejar los casos donde

  1. El archivo stdin está cerrado o roto, por lo que no obtiene nada en absoluto.
  2. El usuario ingresa algo inválido.

Para verificar esto, puede capturar el código de retorno de scanf siguiente manera:

int result = scanf("%d", &myInt);

Si stdin encuentra un error al leer, el result será EOF , y puede verificar errores como este:

int myInt; int result = scanf("%d", &myInt); if (result == EOF) { /* ... you''re not going to get any input ... */ }

Si, por otro lado, el usuario ingresa algo no válido, como una cadena de texto basura, entonces necesita leer los caracteres de la stdin hasta que consuma toda la entrada ofensiva. Puede hacer esto de la siguiente manera, usando el hecho de que scanf devuelve 0 si no se leyó nada:

int myInt; int result = scanf("%d", &myInt); if (result == EOF) { /* ... you''re not going to get any input ... */ } if (result == 0) { while (fgetc(stdin) != ''/n'') // Read until a newline is found ; }

¡Espero que esto ayude!

EDITAR : En respuesta a la pregunta más detallada, aquí hay una respuesta más apropiada. :-)

El problema con este código es que cuando escribes

printf("got the number: %d", scanf("%d", &x));

Esto es imprimir el código de retorno de scanf , que es EOF en un error de flujo, 0 si no se leyó nada, y 1 contrario. Esto significa que, en particular, si ingresa un número entero, siempre se imprimirá 1 porque está imprimiendo el código de estado de scanf , no el número que leyó.

Para arreglar esto, cambia esto a

int x; scanf("%d", &x); /* ... error checking as above ... */ printf("got the number: %d", x);

¡Espero que esto ayude!