2012-11-25 145 views
1

你好這個程序我應該算一個字符串中的字數。到目前爲止,我已經找到了如何找到一個字符串中的字符數量,但無法弄清楚如何轉換生成一個字詞的字母,並將其計爲1個字。計數字符串中的單詞?

我的功能是:

int wordcount(char word[MAX]){ 

    int i, num, counter, j; 

    num = strlen(word); 
    counter = 0; 

    for (i = 0; i < num; i++) 
    { 
     if (word[i] != ' ' || word[i] != '\t' || word[i] != '\v' || word[i] != '\f') 
     { 

     } 

    } 

    return counter; 
} 

我嘗試了一些變化,但如果語句的中間部分是我很困惑。我如何計算字符串中的單詞數量?測試這個測試,如果字符串有多個空格像「你好,這是一個字符串」

+0

你不能使用正則表達式嗎? – danijar

+0

順便說一句:代替'||',你可能需要使用'&&'。 (或者:將'!='改爲'==',並交換if {}和其他{}體)。 – wildplasser

回答

3

只提示,因爲這可能是作業。

您正在計算的是「單詞」字符和空格之間的轉換次數。這將需要記住最後一個字符並將其與當前字符進行比較。

如果一個是空白,另一個不是空白,那麼就有一個轉換。

更詳細地說,將lastchar初始化爲空格,然後遍歷輸入中的每個字符。如果lastchar是空格且當前字符不是,請增加字數。

不要忘記在每次循環迭代結束時將當前字符複製到lastchar。它應該不用說,字數應該被初始化爲0.

+0

謝謝先生!對你沒有給出答案,但讓我知道了!雖然當你寫下「如果lastchar是空格,當前字符不是,請增加字數」時,你確實給了我答案。 –

+0

我的父親被稱爲先生,我的朋友(和網友)可以叫我pax :-)至於答案,你仍然需要編碼。我只是不想讓任何人回來抱怨說,數字是它的兩倍。 – paxdiablo

0

當你在if部分,這意味着你在一個單詞中。因此,您可以標記此inword並查看您是否從單詞(這將是您的其他部分)更改爲inword並返回。

0

這是一個快速的建議的鏈接 - 有可能是更好的方法,但我喜歡這一個。

首先,一定要「知道」一個詞是由什麼組成的。讓我們假設它僅由字母組成。其餘所有內容,即標點符號或「空格」,都可以視爲分隔符。然後,你的「系統」有兩個狀態:1)完成一個單詞,2)跳過分隔符。

您可以免費運行跳過分隔符代碼來開始您的代碼。然後你輸入你將要保留的「完成一個單詞」狀態,直到下一個分隔符或整個字符串的結尾(在這種情況下,你退出)。當它發生時,你已經完成了一個單詞,所以你將你的單詞計數增加1,然後進入「跳過分隔符」狀態。循環繼續。

僞類似C的代碼:如果所述讀取的字符是在[A-ZA-Z_]例如,否則返回假

char *str; 

/* someone will assign str correctly */ 

word_count = 0; 
state = SKIPPING; 

for(c = *str; *str != '\0'; str++) 
{ 
    if (state == SKIPPING && can_be_part_of_a_word(c)) { 
     state = CONSUMING; 
     /* if you need to accumulate the letters, 
      here you have to push c somewhere */ 
    } 
    else if (state == SKIPPING) continue; // unneeded - just to show the logic 
    else if (state == CONSUMING && can_be_part_of_a_word(c)) { 
     /* continue accumulating pushing c somewhere 
      or, if you don't need, ... else if kept as placeholder */ 
    } 
    else if (state == CONSUMING) { 
     /* separator found while consuming a word: 
      the word ended. If you accumulated chars, you can ship 
      them out as "the word" */ 
     word_count++; 
     state = SKIPPING; 
    } 
} 
// if the state on exit is CONSUMING you need to increment word_count: 
// you can rearrange things to avoid this when the loop ends, 
// if you don't like it 
if (state == CONSUMING) { word_count++; /* plus ship out last word */ } 

函數can_be_part_of_a_word返回true。

(它應該工作如果我沒有做過一些嚴重的錯誤與厭惡的教誨)