嗨,我正在尝试通过使用char[]将整个文件加载到fread中来标记字符串。
由于某些奇怪的原因,它并不总是有效,并且valgrind在这个非常小的示例程序中抱怨。

给定类似test.txt的输入

first
second

和以下程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>


//returns the filesize in bytes
size_t fsize(const char* fname){
  struct stat st ;
  stat(fname,&st);
  return st.st_size;
}

int main(int argc, char *argv[]){
  FILE *fp = NULL;
  if(NULL==(fp=fopen(argv[1],"r"))){
    fprintf(stderr,"\t-> Error reading file:%s\n",argv[1]);
    return 0;
  }
  char buffer[fsize(argv[1])];
  fread(buffer,sizeof(char),fsize(argv[1]),fp);
  char *str = strtok(buffer," \t\n");

  while(NULL!=str){
    fprintf(stderr,"token is:%s with strlen:%lu\n",str,strlen(str));
    str = strtok(NULL," \t\n");
  }
  return 0;
}

像编译
gcc test.c -std=c99 -ggdb


./a.out test.txt

谢谢

最佳答案

您的buffer大小应为filesize + 1+1用于null char。

filesize = fsize(argv[1]);
char buffer[filesize + 1];

另外,fread不会在字符串末尾放置\0。因此,您必须按照以下步骤自己做:
fread(buffer,sizeof(char),filesize,fp);
buffer[filesize] = 0;

关于c++ - valgrind提示用c做一个非常简单的strtok,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2565527/

10-13 08:25