2010-11-23 47 views
0

我有一個用C語言編寫的程序,它應該計算單詞「the」出現在作爲參數給出的文本文件中的次數。但程序不斷給出分段錯誤錯誤,我對如何解決問題沒有更多的想法this.Any幫助將不勝感激。謝謝!計數文件中的單詞?

下面是代碼:

 

#include <stdio.h> 
#include <string.h> 
void main(int argc, char *argv[]) 
{ 
    int h,i; 
    FILE *fp; 
    char* mess; 
    for(i=1; i < argc; i++) 
    { 
    h=0; 
    fp=fopen(argv[i],"r"); 
     while (!feof(fp)) 
     { 
     fscanf(fp,"%s",mess); 
     if (strcmp(mess,"the")==0) 
      h++; 
     } 
     printf("The file %s contains the word \"the\" %d times.",argv[i],h); 
     h=0; 
     fclose(fp); 
    } 
} 
 
+0

我可以補充一點,C是這種工作的矯枉過正嗎? 「main = interact $ show。length。filter(==」the「)。words」就夠了。 – 2010-11-23 12:55:20

+0

@IGCA,這大概是一項任務。 – 2010-11-23 13:05:02

回答

5
char* mess; 
[...] 
     fscanf(fp,"%s",mess); 

混亂是未初始化。您需要爲正在閱讀的單詞分配一些空間

s匹配非空白字符的一個序列 ;下一個 指針必須是指向char的指針,而 該數組必須足夠大,以便接受所有序列的 以及終止NUL字符的 。輸入 字符串在空白處或 最大字段寬度處停止,以先發生的先發生者爲準 。

因此您還希望使用字段寬度來限制讀取的內容與緩衝區的大小。這需要仔細處理,因爲緩衝區大小之後的位可能是「the」(例如「呼吸」,如果您閱讀4個字符的單詞,會給您「brea」和「the」以及誤報)

0

fscanf(fp,"%s",mess);不會分配內存!

1

char* mess是一個單位指針。換句話說:它是一個變量,它的值是內存中的隨機地址。在您致電fscanf時,會嘗試在此地址寫入內容,並且程序將崩潰。

要麼mess是一個固定大小的數組,或者使其指向一個有效的內存塊,該內存塊已使用malloc(在此可能無用)進行了動態分配。在這兩種情況下,您可能都希望確保不能讀取超過size的字符,否則最終會出現全新的分段錯誤。

0

你需要爲被給予sscanf緩衝mess分配內存:

char mess[256];

目前,mess未初始化(空)。試圖寫入它的sscanf旅行。

0
while (!feof(fp)) 
{ 
    fscanf(fp,"%s",mess); 
    if (strcmp(mess,"the")==0) 
    h++; 
} 

你從文件中讀取一個字符串,把它變成mess,這是一個普通的指針爲char。你需要的字符數組:

char mess[1000]; 
0

據我可以從代碼讀取,你有沒有初始化mess指針,你用它來通過的fscanf填充之前:

fscanf(fp,"%s",mess); 
0

用於分配內存混亂使用mess=malloc(sizeof(char)*SOME_NUMBER)或簡單地將混亂聲明爲字符數組i。e char mess [1024];