2

そのため、これをさまざまな方法で割り当て作業に取り込もうとしましたが、毎回異なるエラーが発生します。基本的に、私たちが持っているのは、パイプされるファイルの内容をバイト単位で読み取る必要があるプログラムです (ファイルの長さが巨大になる可能性があるため、単に malloc を呼び出して大量のスペースを割り当てることはできません)。ファイルの最後に到達するまで、realloc を使用して、解放されたメモリの量を拡張する必要があります。最終結果は、各バイトを含む 1 つの長い C 文字列 (配列) になるはずです (ファイルの一部である場合は、null バイトも無視できません)。私が現時点で持っているものは次のとおりです。

   char *buff;
   int n = 0;
   char c;
   int count;

   if (ferror (stdin))
   {
      fprintf(stderr, "error reading file\n");
      exit (1);
   }
   else
   {
      do {   
         buff = (char*) realloc (buff, n+1);
         c = fgetc (stdin);
         buff[n] = c;
         if (c != EOF)
             n++;
     }
       while (c != EOF);
   }
   printf("characters entered: ");
   for (count = 0; count < n; count++)
       printf("%s ", buff[count]);
   free (buff);

ファイルの最後まで読み取りを続け、毎回メモリを拡張する必要がありますが、単純なテキスト ファイルをパイプして実行しようとすると、セグメンテーション違反があることがわかります。何が間違っているのかよくわかりません。

malloc などの使用が許可されていることに注意してください。ただし、必要なメモリ量がわかっているため、それを機能させる方法がわかりませんでした。

4

4 に答える 4

3

realloc への最初の呼び出しで、割り当てられていないポインター buf を使用しています。への変更

char *buf = malloc(100);

この問題を回避するために。

いったん機能するようになると、文字ごとに再割り当てが行われるため、プログラムがかなり非効率的であることに気付くでしょう。再割り当ての数を減らすために、より大きなチャンクで再割り当てすることを検討してください。

于 2012-05-08T02:35:15.837 に答える
3
char* buff;
...
buff = (char*) realloc (buff, n+1);

未定義の動作につながる、初期化されたポインターを再割り当てしようとしています。への変更

char* buff = 0;
...
buff = (char*) realloc (buff, n+1);

しかし、指摘されているように、これは非常に非効率的です。

于 2012-05-08T02:35:42.227 に答える
2

@dasblinkenlight と @smocking による回答が現在の理由のようですが、次のクラッシュを避けるためです。

  1. EOF が複数の文字で表されるため、 に変更char c;します。int c;
  2. これは、一度に 1 つの文字に対して realloc を呼び出すのは悪い考えです。代わりに、毎回 X バイト (100 としましょう) 単位でサイズを増やします。これにより、はるかに効率的になります。
  3. バッファの末尾にヌル ターミネータ ('\0') を追加する必要があります。そうしないと、未定義の動作になりprintf()ます。
于 2012-05-08T02:33:52.690 に答える
0

orに読み込むためstdinに思いついたのは次のとおりです( にsを埋め込んだ場合):char[]char*NULLstdin

char* content = NULL;
char c;
int contentSize = 0;

while ((c = fgetc(stdin)) != EOF){
    contentSize++;
    content = (char*)(realloc(content, contentSize+1));
    if (content == NULL) {
        perror("Realloc failed.");
        exit(2);
    }
    content[contentSize] = c;
}

for (int i = 0; i < contentSize; ++i) {
    printf("%c",content[i]);
}
于 2013-10-12T14:03:58.150 に答える