1

我是编程和stackoverflow的新手,这就是为什么我有时可能会在我编写代码并想从文件中获取输入时遇到简单的问题`

#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在阅读十个字符后将循环更改为停止,即使尚未达到空间,您也应该可以。

此外,您将一个字符传递b[len1]到 into 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

您的程序中有两个逻辑错误 ::
1.while(1)您有一个非终止循环,它将导致 stackoverflow。
2.char b[10]在这里, b 是一个大小为 10 的 char 数组,即 ie b[0] to b[9],但在您的程序len1++中,每次迭代都在执行,这将访问超出 的内存b[9]

要克服这些问题,请使用while(len1<10).

于 2012-06-06T18:20:22.027 回答
0

而不是while (1),您应该根据表 b 的大小测试循环索引(所以 10)

你到底想做什么?

于 2012-06-06T18:14:38.000 回答
0

你有两个问题

  1. 当您读取文件并且前 10 个字符不是空格时会发生什么?数组 b 将被耗尽。
  2. printf正在尝试打印一个字符串。b[len1]是一个字符。
于 2012-06-06T18:16:59.653 回答
0

char b[10]只有10个元素。len1无限循环的每次迭代都会递增。这很快就变成了 > 10。最终,在超过 10 的某个地方,您写入了一些您也无权访问的内存。因此出现了段错误。

于 2012-06-06T18:12:41.347 回答