2017-03-01 6 views
0

文字列に含まれるユニークで大文字と小文字が区別された単語の数を計算したいとします。sこれまでは、句読点をスペースに変換し、スペースで区切られた別々の単語をセットに追加しました。 setには一意の要素のみが含まれているため、次の関数は1を返します。ただし、文字列sには大文字と小文字を区別する2つの単語(abAB)があるため、2を返します。C++を使用して文字列内の大文字と小文字を区別する単語を数えよう

文字列sの単語の大文字と小文字の区別を確認するにはどうすればよいですか?

bool isWordSeparator(char c) { 
    return std::isspace(c) || std::ispunct(c); 
} 

int main() { 
    string s = "ab\nAB!ab?AB:ab.AB;ab\nAB"; 

    transform(s.begin(), s.end(), s.begin(), [](char c)->char { 
     if (isWordSeparator(c)) 
      return ' '; 
    }); 

    istringstream iss(s); 

    set<string> words((istream_iterator<string>(iss)), istream_iterator<string>()); 



    cout << "Number of Words: " << words.size() << endl; 

    return 0; 
} 

答えて

4

ここでの問題は、大文字と小文字の区別がありません。それはtransformに供給しているラムダです。

セパレータをスペースで置き換えようとしています。残念ながら、isWordSeparatortrueを返す場合は空白を返しますが、それ以外の場合は何も返されません。

このような何かにあなたの transformを変更

transform(s.begin(), s.end(), s.begin(), [](char c)->char { 
    if (isWordSeparator(c)) 
     return ' '; 
    else 
     return c; 
}); 

...と有用な結果を得ることの可能性はかなり改善されます。

関連する問題