Cómo probar la entrada es sensato.

Considere el siguiente progtwig en C simple.

//C test #include int main() { int a, b, c; printf("Enter two numbers to add\n"); scanf("%d%d",&a,&b); c = a + b; printf("Sum of entered numbers = %d\n",c); return 0; } 

¿Cómo verifica que los valores ingresados ​​son en realidad dos enteros en algún rango sensible? Actualmente, si solo ingresa “a” y luego regresa, obtiene el resultado “Suma de los números ingresados ​​= 32767”.

Ejemplos de entrada incorrecta que me gustaría prevenir.

  1. 2 3 4 (número equivocado de números)
  2. manzana (no un número)
  3. 11111111111111111111111111 1111111111111111111111111111111111111 (números fuera de rango)

¿O debería estar usando fgets y sscanf o incluso strtol ?

La entrada del usuario es malvada. Analizar por

 (optional whitespace)[decimal int][whitespace][decimal int](optional whitespace) 

strtol() y la familia tienen un mejor manejo de errores que scanf() .
Coda: mejor para manejar la entrada del usuario en una función auxiliar . Romper en 2 partes: E / S y análisis.

 #include  #include  #include  #include  #include  // return 1 (success), -1 (EOF/IOError) or 0 (conversion failure) int Readint(const char *prompt, int *dest, size_t n) { char buf[n * 21 * 2]; // big enough for `n` 64-bit int and then 2x fputs(prompt, stdout); // do not use printf here to avoid UB fflush(stdout); // per @OP suggestion if (fgets(buf, sizeof buf, stdin) == NULL) { return -1; } const char *p = buf; while (n-- > 0) { char *endptr; errno = 0; long l = strtol(p, &endptr, 10); if (errno || (p == endptr) || (l < INT_MIN) || (l > INT_MAX)) { return 0; } *dest++ = (int) l; p = endptr; } // Trailing whitespace OK while (isspace((unsigned char) *p)) p++; // Still more text if (*p) return 0; return 1; } int main() { // for testing int Result; do { int dest[2] = { -1 }; Result = Readint("Enter two numbers to add\n", dest, 2); printf("%d %d %d\n", Result, dest[0], dest[1]); } while (Result >= 0); return 0; } 

Se puede utilizar como:

 if( scanf("%d%d",&a,&b) == 2) { //two integer values has been read successfully //do your stuff here } else { //Wrong input } 

También puedes hacer esto para prevenir cualquier cosa después del segundo número.

 int a,b; char c; if( scanf("%d%d%c", &a, &b, &c) == 3) { if (c == '\n') { puts("good"); } } else { puts("bad"); } return 0; } 

Puedes usar la siguiente macro

 #define SCAN_ONEENTRY_WITHCHECK(FORM,X,COND) \ do {\ char tmp;\ while(((scanf(" "FORM"%c",X,&tmp)!=2 || !isspace(tmp)) && !scanf("%*[^\n]"))\ || !(COND)) {\ printf("Invalid input, please enter again: ");\ }\ } while(0) 

y lo llamas de esta manera en la principal

 int main() { int a, b, c; printf("Input first integer, valid choice between 0 and 10: "); SCAN_ONEENTRY_WITHCHECK("%d",&a,(a>=0 && a<=10)); printf("Input second integer, valid choice between 0 and 10: "); SCAN_ONEENTRY_WITHCHECK("%d",&b,(b>=0 && b<=10)); c = a + b; printf("Sum of entered numbers = %d\n",c); return 0; } 

para obtener más detalles sobre esta macro, consulte: Macro común para leer datos de entrada y verificar su validez

Una forma simple sería,

 int a=0, b=0, c=0; 

inicializarlos a 0

Además, la verificación sugerida por Midhun es buena para verificar si hay dos entradas.

Puedes probar este.

 #include  int main(void) { int a, b, c; printf("Enter two numbers to add\n"); scanf("%d%d",&a,&b); if(scanf("%d%d",&a,&b) == 2) { c = a + b; printf("Sum of entered numbers = %d\n",c); } return 0; }