Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将getline与全局变量一起使用_C_Getline - Fatal编程技术网

C 将getline与全局变量一起使用

C 将getline与全局变量一起使用,c,getline,C,Getline,我会读几行文字,所以我想把它保存在一个全局变量中。我做了这样一件事: #include <stdbool.h> #include <stdio.h> static char currentLine[MAX_LINE_LENGTH]; static bool readNextLine(void) { return getline(&currentLine, NULL, stdin); } 我做错了什么?为变量使用正确的类型并正确使用 第一个参数必须是指

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

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

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

我做错了什么?

为变量使用正确的类型并正确使用

  • 第一个参数必须是指向
    char
    的指针
  • 第二个参数不能为
    NULL
  • 正确使用返回值来判断调用是否成功
更正代码:

#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;
}
定义GNU源
#包括
#包括
#包括
静态字符*currentLine=NULL;
静态bool readNextLine(无效)
{
假人尺寸=0;
自由(电流线);
currentLine=NULL;
返回getline(¤tLine,&dummy,stdin)>=0;
}

为变量使用正确的类型并正确使用

  • 第一个参数必须是指向
    char
    的指针
  • 第二个参数不能为
    NULL
  • 正确使用返回值来判断调用是否成功
更正代码:

#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;
}
定义GNU源
#包括
#包括
#包括
静态字符*currentLine=NULL;
静态bool readNextLine(无效)
{
假人尺寸=0;
自由(电流线);
currentLine=NULL;
返回getline(¤tLine,&dummy,stdin)>=0;
}
getline(¤tLine,NULL,stdin)需要处理两件事:分配内存的
char*
和类型
size\u 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;
}

getline(¤tLine,NULL,stdin)需要处理两件事:分配内存的
char*
和类型
size\u 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;
}

man getline:
如果*lineptr为NULL,则getline()将分配一个缓冲区来存储该行,该缓冲区应由用户程序释放。(在本例中,*n中的值被忽略。)或者,在调用getline()之前,*lineptr可以包含一个指向malloc(3)分配的缓冲区*n字节大小的指针。
TL;DR:你不能这样做。将错误的类型传递给
getline
,这就是为什么会出现错误。指向指针E的指针和指向数组的指针都是不同的。man getline:
如果*lineptr为NULL,则getline()将分配一个缓冲区来存储该行,该缓冲区应由用户程序释放。(在本例中,*n中的值被忽略。)或者,在调用getline()之前,*lineptr可以包含一个指向malloc(3)分配的缓冲区*n字节大小的指针。
TL;DR:你不能这样做。将错误的类型传递给
getline
,这就是为什么会出现错误。指向指针E的指针和指向数组的指针都是不同的。