簡體   English   中英

為什么我會出現段錯誤?

[英]Why am I segfaulting?

我對 C 很陌生,我試圖逐個字符地讀取一個文件的內容並將它們輸出到流中。 但即使我的 fopen() 命令被注釋掉,我也會收到段錯誤(核心轉儲)。

我必須運行一個命令:./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!)

}

您不能僅僅發明一種調用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]包含程序名稱(如果可用;如果不可用,則它包含一個空字符串)。

您的程序出現段錯誤,因為您在char *filename[]參數中收到了int argc參數。 如果您使用單個命令行參數運行程序,則作為第一個參數傳入的值將是 2,這不是有效的指針值。 表達式filename[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]?

你在編譯器中逃脫了它,因為,基本上,運氣。

我還注意到在您的示例調用中,參數列表中實際上沒有參數,因為您使用的是重定向。

用:

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

並使用 argv[1] 作為文件名。

主函數必須始終接收那兩個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM