2013-10-16 13 views
1

我是C新手,試圖編寫一個計算括號,大括號,空格和換行符的程序。編譯器發佈錯誤:錯誤打開fileSegmentation錯誤(核心轉儲)在c程序中對字符進行計數的分段錯誤

#include <stdio.h> 


int main(int argc, char *argv[]) 
{ 
    FILE *fp; 
    char c; 
    int blank, tab, openbrace, closedbrace,openbracket,closedbracket, newline=0; 


if ((fp = fopen("argv[0]", "r")) == NULL) 
    { 
    fprintf(stderr, "Error opening file"); 
    } 
while ((c=fgetc(fp)) != EOF) 
{ 
switch(c) 
    { 

     case '{': 
     openbrace++; 

     case '}': 
     closedbrace++; 

     case '[': 
     openbracket++; 

     case ']': 
     closedbracket++; 

     case '\n': 
     newline++; 


    } 
    } 
fclose(fp); 
printf("\nThe number of { are %d", openbrace); 
printf("\nThe number of } are %d", closedbrace); 
printf("\nThe number of [ are %d", openbracket); 
printf("\nThe number of ] are %d", closedbracket); 
printf("\nThe number of new lines are %d", newline); 
} 
+0

'如果((FP =的fopen(argv的[1], 「R」))== NULL){PERROR(argv的[1])...'不包含路徑名和錯誤原因的錯誤消息無用且令人沮喪。 –

+1

你也希望在這些案例陳述之後有中斷陳述。 –

+1

將所有計數器變量初始化爲零。 –

回答

0

的問題是這一行:

if ((fp = fopen(argv[0], "r")) == NULL) 

argv[0]是程序的名稱,你想要的是argv[1]這是第一個用戶的字符串。

因此,它應該是這樣的:

if ((fp = fopen(argv[1], "r")) == NULL) 
0

您需要在打印出錯誤時退出程序。相反,你無論如何都要進入while循環。並且因爲fpnull,所以它崩潰。

2

幾件事:

1)出錯後立即退出 - 不要繼續下去。

2)打開的argv 1,而不是 「的argv [0]」(的argv [0]持有executable name,和你在一個字符串中括起來)

fopen(argv[1], "r") 

這可能是個好主意通過檢查argc也確保argv[1]存在。