Dios mio, pero se les dice y siguen insistiendo.......uno puede llevar un caballo al rio, pero no obligarlo a tomar agua......
Si les ense~aron a usar scanf y fflush(stdin) les estan robando la plata, y ese documento de microsoft da pena, sirve para nada !
/* You must flush the input buffer before using gets. */
fflush( stdin ); // fflush on input stream is an extension to the C standard
printf( "Enter the same sentence with gets: " );
gets( string );
printf( "%s\n", string );
}
Claramente microsoft nunca pondra un codigo en su codigo, ademas ahi claramente dice que el fflush es una extension de el standard de C y por lo que veo es que eso es visual c ++ y no C. Para explicarme voy solo voy a decir lo siguiente
gets(string) es un buffer overflow seguro, y permite a cualquiera reescribir el puntero de interrupcion, de hecho si intentan compilar un programa con esta funcion el compilador envia un warning diciendo eso mismo, es una funcion vieja y que ya nadie usa.
int scanf(const char *format, ...); Sucede lo mismo, no se puede checar por overflows, ni integers overflows ni nada, por ello se evita leer de esta forma. Usen en cambio funciones como getchar o fgets(). Si su argumento es que usan scanf y siempre les ha funcionado intenten esto:
#include <stdio.h>
int main(int argc, char **argv) {
unsigned int x;
scanf("%i",&x);
printf("%d", i);
}
que pasa si el usuario entra 4294967297 ? Ahora diganme que importa si i imprime 1 igual funciona........me imagino que pensaran lo mismo cuando hagan
int *ptr = malloc( i * sizeof(int)); y se den cuenta que tendran un hermoso heap overflow en su programa.
Y ahora si pasamos a fflush(sdin) que obviamente no funcionara si usan gcc pork el fflush es para forzar la escritura de caracteres qeu estan en un output buffer y no la menera de leer input y descartarlo que es realmente lo que ustedes quieren hacer. Ya les dije, la forma de lograrlo es realmente leyendo todo le input..
http://www.eskimo.com/~scs/C-faq/q12.26.htmlEspero ver las perlas que me van a poner como codigos.......que pasa que nadie pone atoi(); ? seguro esa tambien les funciona no ? y como todo programador de windows sabe:
It's OK to crash on bad input.
It's OK to give incorrect output on bad input.
If a bug doesn't show, it doesn't exist.
http://liw.iki.fi/liw/texts/programming-truths.html