我正在尝试使用fgets和sscanf从文件中读取。在我的文件中,我希望将其放入 vector 中的每一行都有字符。到目前为止,我有以下内容:

FILE *fp;
  fp = fopen(filename, "r");
  if(!fp)
  {
    fprintf(stderr, "Unable to open file %s\n", filename);
    return 0;
  }
  // Read file
  int line_count = 0;
  char buffer[1024];
  while(fgets(buffer, 1023, fp))
  {
    // Increment line counter
    line_count++;

    char *bufferp = buffer;

    ...

    while(*bufferp != '\n')
    {
      char *tmp;
      if(sscanf(bufferp, "%c", tmp) != 1)
      {
        fprintf(stderr, "Syntax error reading axiom on "
                "line %d in file %s\n", line_count, filename);
        return 0;
      }

      axiom.push_back(tmp);
      printf("put %s in axiom vector\n", axiom[axiom.size()-1]);

      // increment buffer pointer
      bufferp++;
    }
  }

我的公理 vector 定义为vector<char *> axiom;。运行程序时,出现段错误。当我执行sscanf时会发生这种情况。关于我在做什么错的任何建议吗?

最佳答案

tmp是一个指针,而不是数组,因此读入它会导致缓冲区溢出。

首先,您应该将tmp的默认值更改为:

  char *tmp = malloc(SOME_MAXIMUM_SIZE * sizeof(char));

然后您应该记得在完成操作后释放axioms中的所有指针。

07-28 01:27