Comportamiento inusual al pasar una matriz a una función

#include  #define SIZE 5 void func(int*); int main(void) { int i, arr[SIZE]; for(i=0; i<SIZE; i++) { printf("Enter the element arr[%d]: ", i); scanf("%d", &arr[i]); }//End of for loop func(arr); printf("The modified array is : "); for(i=0; i<SIZE; i++) printf("%d ", arr[i]); return 0; } void func(int a[]) { int i; for(i=0; i<SIZE; i++) a[i] = a[i]*a[i]; } 

Salida :::

texto alternativo

Mientras estoy ingresando elementos enteros, la salida es correcta. Pero cuando ingresé un valor flotante como 1.5, no pedí otros elementos y el O / P es como se muestra en la figura. Creo que debería implícitamente escribir 1.5 para 1 pero no sucedió … ¿puede usted decir por qué sucedió esto? Toda la información sobre el comstackdor se muestra en la figura.

Cuando scanf("%d") un valor como 1.5 el escaneo se detendrá en el punto decimal y devolverá 1.

La próxima vez que llame a scanf , el puntero seguirá apuntando al punto decimal y su escaneo volverá inmediatamente porque no hay dígitos para escanear.

Debería estar verificando el valor de retorno de scanf : le proporciona la cantidad de elementos escaneados exitosamente, que serán 1 inicialmente para el 1 antes del punto decimal y 0 desde ese momento.

Además, scanf significa “escaneado formateado” y le garantizo que no encontrará nada más sin formato que las aportaciones del usuario.

Investiga buscando en fgets para la entrada de línea. Aquí hay una copia de una función que uso a menudo para tales propósitos:

 #include  #include  #define OK 0 #define NO_INPUT 1 #define TOO_LONG 2 static int getLine (char *prmpt, char *buff, size_t sz) { int ch, extra; // Get line with buffer overrun protection. if (prmpt != NULL) { printf ("%s", prmpt); fflush (stdout); } if (fgets (buff, sz, stdin) == NULL) return NO_INPUT; // If it was too long, there'll be no newline. In that case, we flush // to end of line so that excess doesn't affect the next call. if (buff[strlen(buff)-1] != '\n') { extra = 0; while (((ch = getchar()) != '\n') && (ch != EOF)) extra = 1; return (extra == 1) ? TOO_LONG : OK; } // Otherwise remove newline and give string back to caller. buff[strlen(buff)-1] = '\0'; return OK; } 

 // Test program for getLine(). int main (void) { int rc; char buff[10]; rc = getLine ("Enter string> ", buff, sizeof(buff)); if (rc == NO_INPUT) { // Extra NL since my system doesn't output that on EOF. printf ("\nNo input\n"); return 1; } if (rc == TOO_LONG) { printf ("Input too long [%s]\n", buff); return 1; } printf ("OK [%s]\n", buff); return 0; } 

Una vez que obtiene una línea con esa función, puede sscanf al contenido de su corazón, manejando los errores mucho más fácilmente.

Lo que sucede es que scanf deja de leer un número entero cuando ve el '.' Carácter, y lo deja en el buffer de entrada. Luego, las siguientes llamadas a scanf fallan porque el siguiente carácter es '.' y no algo analizable como un entero.

¿Cómo arreglas esto? El primer paso es olvidar que alguna vez escuchó hablar de scanf y usar siempre fgets para leer líneas completas de entrada, luego procesarlos después de leerlos en un búfer de cadena. Puede usar sscanf para este propósito, pero una función robusta como strtol sería mucho mejor.

Problema con el búfer: creo que la parte restante (.5) permanece en el búfer. utilizar flushall(); después de su scanf("%d..