将 getline 与全局变量一起使用

Using getline with a global variable

我会读几行文字,所以我想把它保存在一个全局变量中。我做了这样的事:

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

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

我得到的错误是

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,

我做错了什么?

使用正确的变量类型并正确使用 getline()

  • 第一个参数必须是指向 char.
  • 的指针
  • 第二个参数不能是NULL
  • 正确使用return值判断调用是否成功

更正代码:

#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;
}

getline(&currentLine, NULL, stdin); 期望操纵 2 件事:char * 分配的内存和 size_t 类型的大小。所以这两个项目的地址都需要传递。以下代码失败,因为 getline() 无法更改 currentLine[] 的地址,也没有分配它。

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

而是

#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;
}

注意:稳健的代码将在最终使用缓冲区后执行最终 free()

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

Ref