我需要一个函数来为另一个程序重现 getline 函数的基础,这个函数应该能够正确读取 FP 并且没有巨大的缓冲区(这里 256 应该足够了) 我在下面的代码中有 2 个问题 - 当缓冲区被执行时函数开始返回错误的信息,例如这个文件 http://pastebin.com/BXj3SH92 ( ./a.out < 文件 ) - 当我在不给它一个文件的情况下调用我的函数时,它应该像猫一样工作,但在我按下第一个回车键 ( ./a.out ) 后它停止了
代码如下:
#define MOAR_BUF 256
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
char *my_getline(const int fd)
{
static char save[MOAR_BUF];
static int i = MOAR_BUF;
int g;
int f;
char *save2;
save2 = NULL;
g = 0;
f = 0;
if (g == 0 && i >= (MOAR_BUF -1))
{
i = 0;
g = read(fd, save, MOAR_BUF + 1);
save[g] = '\0';
}
if (i <= MOAR_BUF && save[i] != '\0')
{
save2 = malloc((sizeof(*save2) * MOAR_BUF));
while(save[i] != '\n' && save[i] != '\0')
save2[f++] = save[i++];
save2[f] = '\0';
if (save[i] != '\0')
i = i + 1;
}
return(save2);
}
int main()
{
int i;
char **converted_map;
char *map;
i = 0;
converted_map = malloc(sizeof(*converted_map) * 30);
while(map = my_getline(0))
{
converted_map[i] = strdup(map);
printf("%s\n", converted_map[i]);
i++;
}
}
最佳答案
static char save[MOAR_BUF];
g = read(fd, save, MOAR_BUF);
save[g] = '\0';
您告诉 read
读取 MOAR_BUF
字节,当它成功读取那么多字节时,0 终止写入数组末尾,调用未定义的行为。
您需要告诉 read
读取更少的字节,例如 MOAR_BUF - 1
,或者使缓冲区更大,MOAR_BUF + 1
,例如。
然后,在main
中,
while(map = my_getline(0))
{
printf("%s\n", converted_map[i]);
converted_map[i] = strdup(map);
i++;
}
您在分配之前打印出 converted_map[i]
,这是更多未定义的行为。您需要首先 strdup(map)
到converted_map[i]
,然后您可以打印它。
关于c - 在 C 上重新编码 getline 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17743524/