Hola, he creado una función personalizada de la función
getline() que aparece en el libro de K&R (en su primer capítulo)... quisiera me comentaran su comportamiento bajo sistemas Un*x:
int getLine(char buffer[], int max)
{
int c = EOF, i;
if (!max)
return 0;
for (i
= 0; i
< max
- 1 && (c
= getchar()) != EOF
&& c
!= '\n'; ++i
) buffer[i] = c;
buffer[i] = '\0';
while (c != '\n' && c != EOF)
return (i);
}
Para quien no la comprenda, aunque es bastante simple, simplemente se leen hasta
max - 1 caracteres y se asignan a
buffer[], la diferencia con
fgets() es que dicha función nos puede dejar basura en la
stdin si el usuario introduce una cadena más larga de lo esperado y así, al momento de intentar leer con cualquier otra función desde la
stdin, vamos a leer los caracteres que sobraron de la lectura anterior.
Lógicamente se pueden limpiar con una macro:
#define stdinClr() int c; while ((c = getchar()) != '\n' && c != EOF);
Tal y como lo hago en
getLine(), pero si usáramos siempre
fgets() +
stdinClr(), en caso que el usuario no ingresara más caracteres de lo esperado,
fgets() realizaría su trabajo correctamente y el programa esperaría la entrada de un salto de línea o fin de archivo... lo cual es un comportamiento indeseado.
Por lo que la función
getLine() considero es la más apropiada para obtener una cadena de
n - 1 caracteres y así trabajar con la misma de forma más segura... con la
stdin, claramente.
Ergo, quisiera saber si funciona en otros sistemas fuera de la familia NT. Si alguien tiene la amabilidad... lo que deseo es deshacerme de
fgets() + stdClr() para con la
stdin y hacerlo de forma
portable.