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:
fgets(buffer, size, stdin)
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 *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ó.