嗨,我正在尝试通过使用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/