将 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(¤tLine, 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(¤tLine, 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(¤tLine, &dummy, stdin) >= 0;
}
getline(¤tLine, NULL, stdin);
期望操纵 2 件事:char *
分配的内存和 size_t
类型的大小。所以这两个项目的地址都需要传递。以下代码失败,因为 getline()
无法更改 currentLine[]
的地址,也没有分配它。
char currentLine[MAX_LINE_LENGTH];
getline(¤tLine, 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(¤tLine, ¤tLineSize, stdin) >= 0;
}
注意:稳健的代码将在最终使用缓冲区后执行最终 free()
。
static void readNextLine_CleanUp(void) {
free(currentLine);
currentLine = NULL;
currentLineSize = 0;
}
我会读几行文字,所以我想把它保存在一个全局变量中。我做了这样的事:
#include <stdbool.h>
#include <stdio.h>
static char currentLine[MAX_LINE_LENGTH];
static bool readNextLine(void)
{
return getline(¤tLine, 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(¤tLine, 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(¤tLine, &dummy, stdin) >= 0;
}
getline(¤tLine, NULL, stdin);
期望操纵 2 件事:char *
分配的内存和 size_t
类型的大小。所以这两个项目的地址都需要传递。以下代码失败,因为 getline()
无法更改 currentLine[]
的地址,也没有分配它。
char currentLine[MAX_LINE_LENGTH];
getline(¤tLine, 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(¤tLine, ¤tLineSize, stdin) >= 0;
}
注意:稳健的代码将在最终使用缓冲区后执行最终 free()
。
static void readNextLine_CleanUp(void) {
free(currentLine);
currentLine = NULL;
currentLineSize = 0;
}