2016-03-17 1 views
0

Je vais lire plusieurs lignes de texte, donc je veux le garder dans une variable globale. Je l'ai fait une telle chose:Utiliser getline avec une variable globale

#include <stdbool.h> 
#include <stdio.h> 
static char currentLine[MAX_LINE_LENGTH]; 

static bool readNextLine(void) 
{ 
    return getline(&currentLine, NULL, stdin); 
} 

Une erreur que je reçois est

cc -Wno-unused-function -Wno-unused-variable -O2 -MD -MP -Wall -Werror -c src/parse.c -o build/parse.o 
src/parse.c: In function ‘readNextLine’: 
src/parse.c:14:20: error: passing argument 1 of ‘getline’ from incompatible pointer type [-Werror=incompatible-pointer-types] 
    return getline(&currentLine, NULL, stdin); 
        ^
In file included from src/parse.c:2:0: 
/usr/include/stdio.h:678:20: note: expected ‘char ** restrict’ but argument is of type ‘char (*)[100000]’ 
extern _IO_ssize_t getline (char **__restrict __lineptr, 

Qu'est-ce que je fais mal?

+0

homme getline: 'Si * lineptr est NULL, getline() allouera un tampon pour stocker la ligne, qui devrait être libéré par le programme utilisateur. (Dans ce cas, la valeur de * n est ignorée.) Alternativement, avant d'appeler getline(), * lineptr peut contenir un pointeur sur un buffer alloué de malloc (3) * n octets en taille. TL: DR: Vous pouvez Ne fais pas ça. – EOF

+1

Passer un mauvais type à 'getline' c'est pourquoi vous obtenez une erreur. Un pointeur sur pointe et un pointeur sur tableau sont différents. – ameyCU

Répondre

1

getline(&currentLine, NULL, stdin); attendent à manipuler 2 choses: un char * à la mémoire allouée et une taille de type size_t. L'adresse de ces deux éléments doit donc être transmise. Le code ci-dessous échoue car getline() ne peut pas changer l'adresse de currentLine[] et aucune n'est allouée.

char currentLine[MAX_LINE_LENGTH]; 
getline(&currentLine, NULL, stdin); // fails 

lieu

#include <stdbool.h> 
#include <stdio.h> 

static char *currentLine = NULL; 
static size_t currentLineSize = 0; 

// true when a line is read 
static bool readNextLine(void) { 
    return getline(&currentLine, &currentLineSize, stdin) >= 0; 
} 

Note: le code robuste effectuerait une free() finale après l'utilisation finale du tampon.

static void readNextLine_CleanUp(void) { 
    free(currentLine); 
    currentLine = NULL; 
    currentLineSize = 0; 
} 

Ref

1

Utilisez le type correct pour la variable et utilisez correctement getline().

  • Le premier argument doit être un pointeur vers un pointeur vers char.
  • Le deuxième argument ne peut pas être NULL.
  • Utilisez la valeur renvoyée correctement pour indiquer si l'appel a abouti.

Code corrcted:

#define _GNU_SOURCE 
#include <stdbool.h> 
#include <stdio.h> 
#include <stdlib.h> 
static char *currentLine = NULL; 

static bool readNextLine(void) 
{ 
    size_t dummy = 0; 
    free(currentLine); 
    currentLine = NULL; 
    return getline(&currentLine, &dummy, stdin) >= 0; 
}