getline
Exemple d'exécution
getline
a été mentionné sur cette réponse mais voici un exemple.
Il est POSIX 7 alloue de la mémoire pour nous, et réutilise le tampon alloué sur une boucle gentiment.
Les novices du pointeur, lisez ça : Pourquoi le premier argument de getline est un pointeur sur le pointeur "char**" au lieu de "char*" ?
main.c
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *line = NULL;
size_t len = 0;
ssize_t read = 0;
while (1) {
puts("enter a line");
read = getline(&line, &len, stdin);
if (read == -1)
break;
printf("line = %s", line);
printf("line length = %zu\n", read);
puts("");
}
free(line);
return 0;
}
Compilez et exécutez :
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Résultat : cela se voit sur therminal :
enter a line
Alors si vous tapez :
asdf
et appuyez sur entrée, ceci apparaît :
line = asdf
line length = 5
suivi d'un autre :
enter a line
Ou d'un tuyau vers stdin :
printf 'asdf\nqwer\n' | ./main.out
donne :
enter a line
line = asdf
line length = 5
enter a line
line = qwer
line length = 5
enter a line
Testé sur Ubuntu 20.04.
implémentation de la glibc
Pas de POSIX ? Peut-être que vous voulez regarder le Mise en œuvre de la glibc 2.23 .
Elle décide de getdelim
qui est un simple sur-ensemble POSIX de getline
avec un terminateur de ligne arbitraire.
Il double la mémoire allouée chaque fois qu'une augmentation est nécessaire, et semble sûr pour les threads.
Cela nécessite une certaine extension de la macro, mais il est peu probable que vous puissiez faire beaucoup mieux.