¿Por qué esto acepta una entrada no válida?

Tengo un progtwig triangular en c

#include  // A function which decides the type of the triangle and prints it void checkTriangle(int s1, int s2,int s3) { // Check the values whether it is triangle or not. if ((s1 + s2 > s3 && s1 + s3 > s2 && s2 + s3 > s1) && (s1 > 0 && s2 > 0 && s3 > 0)) { // Deciding type of triangle according to given input. if (s1 == s2 && s2 == s3) printf("EQUILATERAL TRIANGLE"); else if (s1 == s2 || s2 == s3 || s1 == s3) printf("ISOSCELES TRIANGLE\n"); else printf("SCALENE TRIANGLE \n"); } else printf("\nTriangle could not be formed."); } int main(void) { // Initializing variables int a,b,c; // Getting input from user printf("Please enter the sides of triangle"); printf("\nPlease enter side 1:"); scanf("%d",&a); printf("Please enter side 2:"); scanf("%d",&b); printf("Please enter side 3:"); scanf("%d",&c); // Calling function in order to print type of the triangle. checkTriangle(a,b,c); } 

Cuando la entrada es:

 7b 

da un error, que es lo que quiero, pero cuando ingresé los datos de esta manera:

 7 7 7b 

ignora ‘b’ y toma 7 como un entero, pero ¿por qué? ¿Cómo puedo prevenir esto?

Lo que quiero hacer es dar un error también por

 7 7 7b 

Si desea poder detectar un error en la entrada del usuario, como que una línea no sea un entero decimal válido, puede hacer lo siguiente:

  • Lea la entrada en un búfer usando fgets(buffer, size, stdin)
  • Utilice strtoul(buffer, &endptr, 10) para analizar el búfer como un entero decimal (base 10 ), donde endptr es un char*
  • endptr apuntará al primer carácter no válido en el buffer , es decir. el personaje después del último que fue analizado con éxito
  • Ahora si *endptr == '\0' , es decir. endptr apunta al final del buffer , toda la cadena se analizó como un entero decimal válido

Si realmente desea que cada número esté en una línea de entrada separada, y para que toda la línea sea un número o espacio válido, entonces probablemente deba olvidar scanf() y la familia y usar fgets() y strtol() lugar.

 #include  #include  #include  #include  #include  static int read_side(void) { char buffer[4096]; if (fgets(buffer, sizeof(buffer), stdin) == 0) // EOF return -1; char *end; errno = 0; long result = strtol(buffer, &end, 10); if (result < 0 || errno != 0) // Neither errors nor negative numbers are allowed return -1; if (end == buffer) // Nothing was convertible return -1; while (isspace(*end)) end++; if (*end != '\0') // Non-spaces after the last digit return -1; if (result > INT_MAX) // Result too big for `int` return -1; return result; } 

(Si necesitaba aceptar cualquier valor int válido pero distinguir errores, entonces pasaría un puntero a la función y devolvería -1 en caso de error o 0 en caso de éxito, y asignaría el resultado seguro al puntero).

Sí, realmente es tan complicado hacer el trabajo correctamente. Y sí, analizar el resultado de strtol() es tan complicado como eso; Tienes que ser muy cuidadoso. (Y hay una posibilidad externa que me he olvidado de buscar una condición de error detectable). Y no, no creo que pueda hacer el trabajo equivalente con scanf() y otros; en particular, el comportamiento en el desbordamiento con scanf() no está definido.

no debe usar scanf ni hacer scanf (“% [^ \ n] s”, palabra); O use algo como get () también ponga d o x al final de mi ejemplo, no s para string: P

Lea la entrada en un búfer de cadena. Analice la cadena para extraer valores numéricos de cualquier tipo uno por uno.

%d solo acepta enteros intente con %x en scanf () para la entrada hexadecimal.

Mejor puedes ingresar como cadena y luego verificar usando isnumeric() si no, usa scanf("%[^\n]s", word) como @mou sugirió.