2016-03-08 82 views
-1

這是我的程序中的一段代碼,導致最後一行出現分段錯誤。我的程序應該從文件(如果用戶指定的話)或從控制檯的手動輸入中獲取輸入。當用戶通過控制檯輸入句子時,它起作用。但是,當我從外部文件中取出句子時,會在最後一行(即到達EOF完成時的行)出現分段錯誤。 假設文件已關閉,並將內存釋放到此代碼段之外。在外部文件的最後一行出現fgets()和段錯誤問題

下面是摘錄:

if(inputExists == 1) { 
     char *input = malloc(256); 
     ip = fopen(inFile, "r"); 
     if(ip) { 
      while(fgets(input, 256, ip) != NULL) { 
       printf("%s", input); 
      } 
     } 
    } 

這裏是什麼是對外部文件:

bob is working. 
david is a new hire. 
alice is bob's boss. 
charles doesn't like bob. 

這是我得到的輸出時,全部程序(其中用戶的選擇從外部文件中選擇輸入)。

bob is working. 
david is a new hire. 
alice is bob's boss. 
Segmentation fault 

如果你認爲你需要更多的代碼來查找問題讓我知道,我將添加完整的程序(雖然說實話這是非常醜陋,雜亂)。

+3

這麼少的代碼,如此多的缺陷:你忘了關閉文件。免費的記憶。 'fflush(stdout)'應該顯示最後一行。 'sizeof(input)'是錯誤的。你認爲什麼是指針的大小?你需要分配內存的大小(**減一個**)。段錯誤可能在別處。使用調試器並提供[mcve]。 – Olaf

+0

爲什麼不一次一個字符串fscanf?甚至fgetc。我相當有信心fgetc也消耗和存儲換行符。很多簡單的方法可以避免很多簡單的錯誤。 – Chirality

+2

'sizeof(input)'不會做你想要的。這只是變量'input'的大小,它是一個指針,所以它將是一個小的,固定的數量,比如4或8.它無法知道你從'malloc'請求了多少空間,對?所以你需要使用256的大小。 –

回答

0

好吧,我發現問題是什麼。我有我的指針malloc'd在它接收來自輸入文件的字符序列的循環之外。正因爲如此,它引用了同一個位置,並且重複了......顯然,當我試圖引用多行代碼時,這會引發問題,因爲*輸入變量只是指向代碼的最後一行。當我將其更改爲:

else if(inputExists == 1) { 
     //First open the file 
     inputFile = fopen(inFile, "r"); 
     //If said file exists 
     if(inputFile) { 
      while(!feof(inputFile)) { 
      char *temp2 = malloc(500); 
      fgets(temp2, 500, inputFile); 
      if((strlen(temp2)>0) && (temp2[strlen (temp2) - 1] == '\n')) { 
       temp2[strlen (temp2) - 1] = '\0'; 
      } 
      root = insert(root, temp2); 
      } 
     }else { 
      printf("The file/directory you specified does not exist or won't open.\n"); 
     } 
     fclose(inputFile); 
    } 

代碼工作。感謝您的幫助,雖然傢伙/女孩,這是不勝感激,我瞭解了很多關於指針和fgets一般

0

存在多個問題。首先,free分配內存。

free(input); 

此外,文件需要被關閉。

fclose(ip)