从C中的文件中获取输入

时间:2012-06-06 18:10:31

标签: c file input

我是编程和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;
}

它给出了分段错误,原因是什么?

5 个答案:

答案 0 :(得分:2)

您有缓冲区溢出。如果您在读取十个字符后将while循环更改为停止,即使未达到 space ,也应该没问题。

此外,您将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;
}

答案 1 :(得分:0)

char b[10]只有10个元素。 len1在无限循环的每次迭代中递增。这很快就会变成&gt; 10.最后在10点左右你写入一些你也无法访问的内存。因此,seg故障。

答案 2 :(得分:0)

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

你想做什么?

答案 3 :(得分:0)

你有两个问题

  1. 当您阅读文件并且前10个字符不是空格时会发生什么?数组b将被esxhausted。
  2. printf正在尝试打印字符串。 b[len1]是一个角色。

答案 4 :(得分:0)

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

要解决这些问题,请使用while(len1<10)