2015-05-24 47 views
-2

我試圖測試是否在file.txt的字符是一個空格「」或不使用此代碼:測試從文件

char *Appartient (FILE *f, char *S) 
{ 
    int i = 0, nbdechar = 0, nbocc = 0, PosdePremierChar, space = 0; 
    char c; 
    while ((c = getc(f)) != EOF) { 
     PosdePremierChar = ftell(f); 
     if (c == S[0]) { 
      nbdechar = 0; 
      for (i = 1; i < strlen(S); i++) { 
       c = getc(f); 
       if (c == S[i]) { 
        nbdechar++; 
       } 
      } 
      if (nbdechar == strlen(S) - 1) { 
       nbocc++; 
      } else { 
       rewind(f); 
       fseek(f, PosdePremierChar - 1, SEEK_CUR); 
       while ((c = getc(f)) != ' '); 
      } 
     } else { 
      while ((c = getc(f)) != ' ') { 
       space++; 
      } 
     } 
    } 
    printf("\n Le nb d'occurence est %d", nbocc); 
    if (nbocc == 0) { 
     return "false"; 
    } else { 
     return "true"; 
    } 
} 

但一個奇怪的符號「在一個字符串的空間ے」看起來像一個垃圾當我檢查我的調試器變量「C」:

screenshot of debugger showing that variable 'c' has the value -1, which is interpreted as the character 'ے'

什麼是錯的

+1

絕對清楚你的要求!什麼是調試模式?角色是如何出現的?我懷疑它,你沒有發佈打印字符的coed,發佈的代碼根本沒有用處,不可能知道'f'是否被打開,唯一非常明顯的是發佈代碼,它有醜陋的格式。 –

+0

調試模式讓我看到c的價值每一次工作,它的工作步驟購買步驟,問題是爲什麼我字符空間它不認爲像一個字符空間:) – Programmer

+0

「怪異的符號」是[U + 06D2 ARABIC LETTER YEH BARREE](http://www.fileformat.info/info/unicode/char/06d2/index.htm)。該字符可能在您的文件中,但通常情況下,getc不能將變量設置爲0x06D2。我們需要查看你的*完整程序*,並且我們還需要通過更改代碼來了解您正在使用的操作系統,編譯器和IDE(如果有的話),以及*完全*這種「調試模式」的工作方式?在調試器中單步執行? (哪個調試器?)最後,看到引發這個問題的文件會很有幫助。 – zwol

回答

1

修改這樣的代碼,跟蹤它,你可能就什麼getc()回報之間的關係變得開明如何關聯到char S:

#include <stdlib.h> 
#include <stdio.h> 


int main(void) 
{ 
    int result = EXIT_SUCCESS; 

    FILE * f = fopen("test.txt", "r"); 
    if (NULL == f) 
    { 
    perror("fopen() failed"); 
    result = EXIT_FAILURE; 
    } 
    else 
    { 
    int result = EOF; 

    while (EOF != (result = getc(f))) 
    { 
     char c = result; 

     printf("\n%d is 0x%02x is '%c'", result, result, c); 
     if (' ' == c) 
     { 
     printf(" is space "); 
     } 
    } 

    printf("\nread EOF = %d = 0x%x\n", result, result); 

    fclose(f); 
    } 

    return result; 
} 
3

可能是從轉換檔案結尾結果的結果,EOF(標準化爲負數,通常爲-1)。

請注意,如果文件中沒有空格,則自從EOF != ' '開始,循環不會終止,並且在第一次點擊文件結束後該條件保持爲真。如果f打開

+0

有空格int文件我不試圖測試EOF我試圖測試空格字符,告訴我一個新的字會出現 – Programmer

+1

@Programmer但你必須測試'EOF',因爲如果你不那麼循環將永遠不會結束。 –

+0

@programmer然後,你應該向我們展示你的實際程序,而不是你編造的東西。沒有任何聲明在任何地方打印'c ='x''。而且你應該測試'fopen()'的返回值,因爲它很容易失敗。 – Jens

0

你沒有測試,如果它沒有那麼未定義行爲會發生,檢查文件是否打開

FILE *file; 
int chr; 

if ((file = fopen("test.txt", "r")) == NULL) 
{ 
    fprintf(stderr, "Cannot open `test.txt'\n"); 
    return -1; 
} 

while (((chr = fgetc(file)) != EOF) && (chr == ' ')) 
    printf("space\n"); 

你應該聲明intchr,因爲fgetc()回報int,例如EOF要求是int而不是char

此外,調試模式是用於跟蹤變量的值是有用的,我敢打賭,它可以在五你在ASCII或十進制或十六進制的值,如您需要,如果你知道如何提問。

+0

當我使用一個文件時,fgetc和getc有什麼區別? 和我改變c爲int,但他現在比較字符的代碼ASCII與另一個字符..現在它是一個無限循環 – Programmer

+0

這是一個[實現細節](http://man7.org/linux/man-pages /man3/ungetc.3.html)與你的probelem非常不相干。 –

+0

非常感謝,但我將如何讓編譯器測試空間的角色? – Programmer