2013-11-23 12 views
0

我想使用此函數計算文件中每行的字數,@params line_number是文件包含的行數。C中文件中每行的字數

當我嘗試分析這個文件:

world hello 
hello world 
hello hello 

world salut 

我得到這些成果爲載體

vector[0] = 2 
vector[1] = 2 
vector[2] = 2 
vector[3] = 1 
vector[4] = 2 

什麼是錯我的代碼?如何避免在沒有文字的情況下獲得1而不是0?

int * get_vtor(FILE *file, int line_number) 
{ 
    int *vtor = malloc(line_number*sizeof(int)), max, j, k, u; 
    char a_file_line[TAILLE_MAX_LINE]; // TAILLE_MAX_LINE is #define earlier to 100 
    j = k = u = max = 0; 
    rewind(file); 

    while((fgets(a_file_line, TAILLE_MAX_LINE ,file)) != NULL) 
    { 
    char * current = strtok(a_file_line," "); 
    while(current != NULL) 
    { 
    u++; 
    current = strtok(NULL, " "); 
    } 

    *(vtor+j) = u; 
    u = 0; j++; 
    memset(a_file_line, 0 , sizeof(a_file_line)); 
    } 

    return vtor; 
} 
+6

多麼複雜的方法來計算單詞... –

回答

0

您確定該行真的是空的並且沒有換行符嗎?當我在本地測試strtok時,它永遠不會返回空字符串。但是,fgets不會從字符串中去除尾隨的換行符,因此,您的代碼將其計爲「一個字」。

您可以通過將strtok調用中的取消字符串更改爲" \n"而不是" "來解決此問題。

小調式注:我不知道是誰教這個語法,但它是不必要的困難閱讀:

*(vtor+j) = u; 

您可以編寫更清晰的:

vtor[j] = u; 
+0

它實際上有一個空間字符,我應該提到這一點。 – maximegir

+0

這不是空格字符,它是終止換行符。 –

+0

您可以通過調整「strtok」來修復它。查看最近的編輯。 –

0

因爲你正在使用'strtok',它總是返回整個字符串,如果在第一個命中沒有標記。所以對於空行你會得到'\ n'。

只是過濾它,你會得到正確的結果。

while(current != NULL && *current != '\n') 
0

與fgets後刪除換行符:

while((fgets(a_file_line, 100 ,file)) != NULL) 
    { 
    a_file_line[strlen(a_file_line) - 1] = 0; 

它計算換行符的話,因爲當你分割一個非空字符串,它總是有,即使沒有分隔符一個令牌。

相關問題