2

char[]こんにちは、ファイル全体を usingにロードして、文字列をトークン化しようとしています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

ありがとう

4

5 に答える 5

6

あなたのbufferサイズは ですfilesize + 1。はチャー+1用です。null

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

また、文字列の末尾にfreada を付けません。\0したがって、次のように自分で行う必要があります。

fread(buffer,sizeof(char),filesize,fp);
buffer[filesize] = 0;
于 2010-04-02T07:34:45.700 に答える
5

このサイトから:

int main(int argc, char* argv[])
{
  std::string str = "The quick brown fox";

  // construct a stream from the string
  std::istringstream stream(str);

  // use stream iterators to copy the stream to the vector
  // as whitespace separated strings
  std::istream_iterator<std::string> it(stream), end;

  std::vector<std::string> results(it, end);

  // results = ["The", "quick", "brown", "fox"]
}

頭を叩き続ける厄介なCストリングに対処するよりもはるかに簡単です。

そして、高階メソッドを使用することの何が素晴らしいか知っていますか? 必要な画面領域が少なくなり、理解しやすくなります。

于 2010-04-02T08:53:45.887 に答える
2

buffernull で終了していません。ファイルのサイズよりも 1 バイト大きくする必要があり、最後のバイトを\0.

于 2010-04-02T07:35:01.990 に答える
2

バッファは次のようfilesize + 1にする必要があり、終端の 0 も設定する必要があります。

int size = fsize(argv[1]);
char buffer[size + 1];
buffer[size] ='\0';

また、おそらくスタックではなくヒープにバッファを割り当てる必要があります...

于 2010-04-02T07:38:37.920 に答える
1

バッファが小さすぎます。これを試して:

int fileSize = fsize(argv[1]);
char buffer[fileSize + 1]; 
buffer[fileSize] = 0;

への呼び出しの直前fread

于 2010-04-02T07:37:44.213 に答える