Moui, c'est pas mal. Juste pour info, malloc et realloc te renvoie un bout de mémoire NON initialisé. Ha, ha, moi aussi étant jeune padawan, je suis tombé souvent dans le piège plus d'une fois. Sinon en plus efficace, tu lit le fichier d'un coup, tu comptes les lignes et assignes à ton tableau du genre :
char ** get_fortune(void)
{
char ** text;
char * content;
char * p;
FILE * file;
int n, sz;
file = popen("/usr/games/fortune", "r");
if (file == NULL) return NULL;
// Lit d'un bloc le fichier
fseek(file, 0, SEEK_END); sz = ftell(file);
fseek(file, 0, SEEK_SET);
if (sz == 0) return NULL;
content = malloc(sz + 1);
sz = fread(content, 1, sz, file);
content[sz] = 0;
fclose(file);
// Compte les lignes
for (p = content, n = 0; *p; p ++)
if (*p == '\n') n ++;
// Construit le tableau
text = malloc((n + 1) * sizeof *text);
for (p = content, n = 0; p; p = strchr(p, '\n'), n ++) {
if (p > content) *p++ = 0;
text[n] = p;
}
text[n] = NULL;
return text;
}
Faudra penser à libérer text[0] et text (la valeur de retour).
Disclaimeur : pas testé :-(
[^] # Re: Réponses
Posté par pierthi . En réponse au message valeur NULL d'un tableau de pointeur. Évalué à 2.
char ** get_fortune(void) { char ** text; char * content; char * p; FILE * file; int n, sz; file = popen("/usr/games/fortune", "r"); if (file == NULL) return NULL; // Lit d'un bloc le fichier fseek(file, 0, SEEK_END); sz = ftell(file); fseek(file, 0, SEEK_SET); if (sz == 0) return NULL; content = malloc(sz + 1); sz = fread(content, 1, sz, file); content[sz] = 0; fclose(file); // Compte les lignes for (p = content, n = 0; *p; p ++) if (*p == '\n') n ++; // Construit le tableau text = malloc((n + 1) * sizeof *text); for (p = content, n = 0; p; p = strchr(p, '\n'), n ++) { if (p > content) *p++ = 0; text[n] = p; } text[n] = NULL; return text; }Faudra penser à libérer text[0] et text (la valeur de retour). Disclaimeur : pas testé :-(