1

私はプログラミングとスタックオーバーフローが初めてなので、何かをコーディングしてファイルから入力を取得したいときに、簡単な質問をすることがあります`

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
   int len1=0;
   FILE* p;
   char a;
   char b[10];
   p = fopen(argv[1],"r");
   while (1)
   {
      a = fgetc(p);

      if(a == ' ') break;
      else
      {
         len1++; 
         b[len1-1] = a;
      }
   }
   printf("%c\n", b0);
   return 0;
}

セグメンテーション違反が発生しますが、その理由は何ですか?

4

5 に答える 5

2

バッファ オーバーランが発生しています。スペースに達していなくてwhileも、10 文字を読み取った後に停止するようにループを変更すると、うまくいくはずです。

さらに、文字を に渡し、b[len1]ポインターprintfとして解釈しますこれは何があってもセグメンテーション違反になります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
   int len1=0;
   FILE* p;
   char a;
   char b[10+1]; // <<== need one more byte for the terminator
   if (argc != 2)
   {
      fprintf(stderr, "Need to supply a filename\n");
      return (-1);
   }
   p = fopen(argv[1],"r");
   if (p == NULL)
   {
      fprintf(stderr, "Cannot open file %s\n", argv[1]);
      return(-2);
   }
   while (len1 < 10) // <<== avoid buffer overruns
   {
      a = fgetc(p);

      if(a == ' ') break;
      else
      {
         len1++; 
         b[len1-1] = a;
      }
   }
   b[len1] = '\0'; // <<== Don't forget to zero-terminate
   printf("%s\n", b); // <<== Pass the buffer, not the last character from it
   return 0;
}
于 2012-06-06T18:15:04.170 に答える
0

プログラムには2つの論理的なバグがあります::
1.while(1)終了しないループがあり、スタックオーバーフローが発生します。
2.char b[10]ここで、bはサイズ10のchar配列です。つまりb[0] to b[9]、プログラムの場合と同様に、len1++反復ごとに実行され、。を超えるメモリにアクセスしますb[9]

これらの問題を克服するには、を使用しますwhile(len1<10)

于 2012-06-06T18:20:22.027 に答える
0

の代わりに、テーブル b のサイズ (10) に対して ループ インデックスをテストwhile (1)する必要があります。

正確に何をしたいですか?

于 2012-06-06T18:14:38.000 に答える
0

あなたには2つの問題があります

  1. ファイルを読み、最初の 10 文字がスペースでない場合はどうなりますか? 配列 b は esxhausted になります。
  2. printf文字列を印刷しようとしています。b[len1]キャラクターです。
于 2012-06-06T18:16:59.653 に答える
0

char b[10]要素は 10 個しかありません。len1無限ループの反復ごとにインクリメントされます。これはすぐに 10 を超えます。最終的に 10 を超えると、アクセスできないメモリに書き込みます。したがって、セグフォルト。

于 2012-06-06T18:12:41.347 に答える