2016-02-14 97 views
-1

我試圖創建一個計算句子中單詞數的程序,但是當我找到空格或標點符號(?)時, !,:,;,或。)我不能認爲下一個字符是一個字母。如果我在尋找一封信,我需要跳過所有的空格和標點符號,直到找到既不是空格也不是標點符號的東西。我還需要考慮到單詞之間可能會有不止一個空格。我寫了一個標點符號函數:計算不包括標點符號和單詞之間多於一個空格的句子中的單詞數

bool is_punctuation (string character) 

{ 

    if (character == "!") 
     return true; 
    else if (character == "?") 
     return true; 
    else if (character == ";") 
     return true; 
    else if (character == ":") 
     return true; 
    else if (character == ".") 
     return true; 
    else 
     return false; 
} 

我用它來查找用戶輸入的句子數。我現在需要找到字數,並且在沒有使用空間位置的情況下很難找到一種方法。我已經得到了這個功能,但需要一些幫助!任何意見非常讚賞:)

void num_sentence (string phrase) 

{ 

    int num_sentence = 0; 
    for (int i = 0; i < phrase.length(); i++) 
    { 
     if (is_punctuation(phrase.substr(i,1))== true) 
      num_sentence++; 
    } 
+0

你看到幾句話? – IInspectable

回答

0

首先,它是沒有意義的使用std::string單個字符。這就是char的用途。

現在,用相反的方法做起來會容易得多:檢查一個字符是字母而不是標點符號。這很簡單:字符是否在範圍a-z或A-Z中。對於這種情況,它也是一個好主意,包括撇號,因此「它的」,例如,看起來像一個字:

bool is_letter(char c) 
{ 
    return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '\'') 
     ? true:false; 
} 

你有另一個問題是如何定義的詞。看看任何一句話。你在哪裏看到每個單詞開始?當你看到一封信時。每個詞什麼時候結束?當你看到除了一封信以外的其他東西。

您不計算標點符號的數量。你不關心它是單個單詞之間的一個,兩個,三個或更多個非字母字符。

當您掃描一個句子時,從開始到結束,您一次掃描一個字符。只要你看到一封信,這就是下一個單詞的開始。當你不再看到一封信時,這是單詞的結尾,那麼你只要繼續看,直到看到下一封信。這將是下一個字。

換句話說,如果您看到的前一個字符不是字母,但當前字符是字母,則您只看到另一個字的開頭。

現在,所有你需要做的就是把這種代碼:

size_t num_words(const std::string &sentence) 
{ 
    bool previous_char_was_letter=false; 
    size_t n=0; 

    for (char c:sentence) 
    { 
     bool this_char_is_letter=is_letter(c); 

     if (!previous_char_was_letter && this_char_is_letter) 
      ++n; 

     previous_char_was_letter=this_char_is_letter; 
    } 

    return n; 
} 

現在,不看這完全像我剛纔的描述,翻譯成代碼?