为什么我会分裂?

时间:2014-02-06 00:56:52

标签: c segmentation-fault fopen

我是C的新手,我试图逐个字符地读取一个文件的内容并将它们输出到流中。但即使我的fopen()命令被注释掉,我也会收到段错误(core dumped)。

我必须运行一个命令:./ a.out< testWords.in> myOut.txt正确执行我的文件。

这是我到目前为止所做的:

#include  <stdio.h>
void main(char *fileName[]) 
{
  printf("filename is %s.\n",fileName[0]);
  //Get file based on a string inputed
  FILE *fp=fopen(fileName[0],"r"); //Fetches our file as read only
  char ch;
  int lineCount = 0;
  int wordCount = 0;
  int charCount = 0;

  //Failed to find/open file. NULL character.
  if (fp == 0) printf("Woops! Couldn't open file!\n");

  //While not at end of file, grab next char.
  else while( (ch=fgetc(fp)) != EOF) 
    {
      if (ch == '\n') //on newline
      {
    //Prints (charCount,wordCount)\n lineCount:
    printf("(%d,%d)%c%d:",charCount,wordCount,ch,lineCount);
    charCount = 0;
    lineCount += 1;
      }
      else printf("%c",ch); //mirrors char.
    }
  fclose(fp); //Closes file (gotta be tidy!)

}

3 个答案:

答案 0 :(得分:2)

你不能仅仅发明一种方法来呼叫main。您需要使用其中一种标准方法,例如:

int main(int argc, char *argv[])
{
    if (argc < 2) {
        fprintf(stderr, "Missing filename\n");
        return -1;
    }
    FILE *fp = fopen(argv[1], "r");
    // ...
}

请注意argv[0]包含程序名称(如果可用;如果不可用,则包含空字符串)。

您的程序因为您在int argc参数中收到了char *filename[]参数而发生了分段错误。如果使用单个命令行参数运行程序,则作为第一个参数传入的值将为2,这不是有效的指针值。表达filename[0]的解除引用解决了导致段错误的问题。

答案 1 :(得分:0)

每当你在C中得到段错误时,你应该闻到一个错误的指针或地址在一个参数列表中。在这种特殊情况下,main的签名始终 int main(int argc, char** argv)。你的不是。

你想要的是

int main(int argc, char ** argv) {
  ...
  FILE * fp = fopen(argv[1]); // Quiz: why argv[1]? What's argv[0]?

你在编译器中侥幸成功,因为基本上,幸运。

我还注意到在你的示例调用中,参数列表中实际上有 no 参数,因为你正在使用重定向。

答案 2 :(得分:0)

使用:

int main(int argc, char* argv[])

并使用argv [1]作为fileName。

主要功能必须始终接收两个参数。