2013-03-30 89 views
0

我正在嘗試編寫一個程序,該程序從定向到stdin的文件中讀取,然後在該文件中找到兩個最常用的單詞。我幾乎一切工作正常,但現在我有我的while循環雖然循環分段錯誤

char *word=readWord(); 
int end=0; 
while(end==0&&word!=NULL){ 
    printf("word readn %s\n",word); 
    list=addToList(list,word); 
    printf("added to list\n"); 
    word=readWord(); 
    if(word==NULL){ 
     end=1; 
     printf("word is null\n"); 
    } 
} 
printf("done while loop"); 

奇分段錯誤從這個輸出是使用有句話一二三四個文件運行時,如下所示。

 
word readn one 
added to list 
word readn two 
added to list 
word readn three 
added to list 
word readn four> 
added to list 
word is null 
Segmentation fault 

readWord函數在其他文件中工作正常;

char * readWord(){ 

    //temporary char array to read string 
    char c,word[BUFFER_SIZE]; 

    if(scanf("%c",&c)==EOF){ 
     return NULL; 
    } 
    while(!((c>='a'&&c<='z')||(c>='A'&&c<='Z'))){ 
     if(scanf("%c",&c)==EOF) 
      return NULL; 
    } 
    int i; 
    for(i=0;(c>='a'&&c<='z')||(c>='A'&&c<='Z');i++){ 
     word[i]=c; 
     scanf("%c",&c); 
    } 
    word[i+1]='\0'; 

    //dynamic allocation of just enough memory to store the word 
    char * str= malloc(strlen(word) +1); 
    strcpy(str,word); 
    return str; 
} 
+1

可能需要''addtoList''和你的示例文件。 '因爲''單詞readn four>''這一行,如果不是拼寫錯誤,看起來與別人不同。 – gongzhitaao

+0

'scanf(3)'返回匹配項的數量,與'EOF'相比毫無意義。推測你想用'c = getchar()'來讀取單個字符。 – vonbrand

+1

@vonbrand它是有道理的。 http://www.cplusplus.com/reference/cstdio/scanf/說*如果讀取錯誤發生或在讀取時達到文件結束,則設置正確的指示符(feof或ferror)。而且,如果在任何數據可能成功讀取之前發生任何數據,則返回EOF。* – gongzhitaao

回答

0

第一件事是,我在你的for循環的結束值大於這個詞的長度多一個所以這是不正確的:

word[i+1]='\0' 

應:

word[i]='\0' 

的其他意見夫婦:

  • 我們Ë因而isalpha(三)
  • 崩潰的malloc/strcpy的到的strdup
  • 寫結束== 0 & &字!= NULL作爲(完== 0)& &(字!= NULL)
+0

沒有解決我遇到的問題,但確實修復了其他幾個問題 – Markko

+0

我希望你能解決你原來的問題。 – jarmod