Skip to content

Instantly share code, notes, and snippets.

@danirod
Created January 14, 2024 19:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danirod/ff1adc56a1f04ac3986775cfa6a04044 to your computer and use it in GitHub Desktop.
Save danirod/ff1adc56a1f04ac3986775cfa6a04044 to your computer and use it in GitHub Desktop.
Cómo funciona fgets para gente con poca memoria
Cómo funciona fgets para gente con poca memoria
===============================================
fgets(buffer, len, source)
Lee hasta (len-1) caracteres desde [source] y los deja sobre
el buffer apuntado por [buffer]. Normalmente lo invocarás
para leer de stdin como
fgets(buffer, BUFSIZ, stdin)
* Retorno:
- Si ha leído algo, devuelve la cadena de caracteres leída.
- Si no ha leído nada o si el buffer source está en EOF,
devuelve NULL.
* Condiciones de lectura
- fgets incluye el \n al final de la línea.
- Por lo tanto, leer una línea vacía no es no leer nada
porque vas a leer una cadena que tiene un "\n".
- fgets se asegura de poner un 0 al final de la cadena
leída.
- Por lo tanto, vas a leer hasta (len-1), porque (len)
incluye el \0 final.
- Si pulsas Enter, tienes la certeza de que fgets devuelve
(es decir, fgets no junta dos líneas separadas de stdin)
- Si metes por teclado una línea de más de [len-1] caracteres,
fgets va a leer lo que quepa, pero recuerda llamarla más
veces para leer la segunda parte. (Sabes que has terminado
de leer la línea porque termina por \n\0)
* Algunas observaciones hechas con un programa de prueba
- echo '' | ./main
Como el echo contiene un \n, un primer fgets devuelve "\n"
Un segundo fgets devuelve NULL porque no hay más lineas
en stdin.
- echo -n '' | ./main
Como el echo no contiene un \n, es una cadena vacía, por
lo tanto fgets() devuelve NULL al instante la primera
vez y sucesivas llamadas.
- echo -e "hola\nadios" | ./main
El echo contiene dos líneas (adios también incluye un \n
al final porque no he puesto el -n). Por lo tanto, la
primera llamada a fgets devuelve "hola\n" y la segunda
llamada a fgets devuelve "adios\n".
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment