0

我需要一个函数来为另一个程序重现基本的 getline 函数,这个函数应该能够正确读取 FP 并且没有巨大的缓冲区(这里 256 应该足够了)我在下面的代码中有 2 个问题 - 函数开始当缓冲区被执行时返回错误信息,例如这个文件http://pastebin.com/BXj3SH92 ( ./a.out < file ) - 当我调用我的函数而不给它一个文件它应该像一个文件一样工作cat 但是在我按下第一个输入键后它停止了( ./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++;
    }
}
4

1 回答 1

3
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)to converted_map[i]然后才能打印。

于 2013-07-19T10:26:19.837 回答