2015-11-24 26 views
0

我有這個程序,它從.txt文件中刪除所有以相同符號開始和結束的單詞。在我看來,它應該工作,但不知何故,當達到EOF它不會停止和紅外打印我一些奇怪的中國符號...我的程序沒有找到EOF符號

下面的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 255 

void search(char *symbolMass, FILE *duomFail, FILE *rezFail) 
{ 
    int i = 0, k =0, j =0, p = 0; 
    char symbol = 0; 
    char *rezMass; 
    char word[20]; 

    rezMass = (char*)malloc(sizeof(char)*MAX); 

    while(simbolis != EOF) 
    { 
     printf("veikia"); 
     symbol = symbolMass[i]; 

     if (symbol != 32 && symbol != 10 && symbol != EOF) 
     { 
      word[j] = symbol; 
      i++; 
      j++; 
     } 

     else 
     { 
      word[j] = symbol; 
      i++; 
      if(word [0] == word[j - 1]) 
      { 
       rezMass[k] = word[j]; 
       k++; 
      } 
      else 
      { 
       for (p = 0; p <= j; p++, k++) 
       { 
        rezMass[k] = word[p]; 
       } 
      } 
      j = 0; 
     } 
    } 
    for(i = 0; i <= k; i++) 
     symbolMass[i] = rezMass[i]; 
} 

int main(int argc, char* argv[]) 
{ 
    FILE *duom, *rez; 
    char *symbols; 


    symbols = (char*)malloc(sizeof(char)*MAX); 
    if (argc > 1) 
    { 
     duom = fopen (argv[1],"r"); 
     rez =fopen (argv[2],"w"); 
     if (duom != NULL) 
     { 
      while (symbols != NULL) 
      { 
       fgets(symbols, MAX, duom); 
       search(symbols, duom, rez); 
       fputs(symbols, rez); 
      } 
      fclose(duom); 
     } 
     else 
     { 
      printf("There is no file with name \"%s\"\n",argv[1]); 
     } 
    } 
    else 
    { 
     printf("The command has no arguments.\n"); 
    } 

    fclose(rez); 
    free(simboliai); 

    return 0; 
} 

它的工作原理是這樣的:它掃描符號並將它們放入「單詞」直到它到達「空格」,「新行」或「EOF」,然後檢查單詞是否以相同符號開始和結束,如果是,則只打印「空格」 「新行」或「EOF」,如果不是,則打印整個單詞。 哦,並且代碼是用C編寫的(如果它很重要,則使用CodeBlocks)。

+3

什麼是'辛博lis'?如果你將'symbol'與'EOF'進行比較,'symbol'應該是'int',而不是'char'。 – mch

+0

它必須是「符號」忘記改變。爲什麼它應該是int?我正在檢查ASCII碼。 – Tripper

+0

** EOF **是一個很大程度上虛構的東西。 –

回答

3

這是因爲EOF字符在緩衝區中傳遞給search函數。緩衝區symbolMass是一個字符串,並且與C中的所有字符串一樣,它由特殊的空字符'\0'(偶然碰巧與0相同)終止。

我建議你改變你的循環,這樣的事情

char symbol; 

for (int i = 0; (symbol = symbolMass[i]) != '\0'; ++i) 
{ 
    ... 
} 

另外,不要對文字使用「幻數」,用實際的字符文字代替,所以不是

if (symbol != 32 && symbol != 10 && symbol != EOF) 

if (symbol != ' ' && symbol != '\n') 
+0

因此而不是「while(symbol!= EOF)」我應該這樣做「while(symbol!='\ 0')」? – Tripper

+1

'main'中的循環也存在問題,它不檢查'fgets'的返回值... –

+0

好吧,我現在明白了。我會盡力解決你們提到的問題。謝謝! :) – Tripper