2016-04-30 17 views
0

私は助けが必要です。 私は、文章中で最も長い単語を印刷する関数を持っています。 しかし、最短の単語を表示するには?文字列の中で最短の単語を見つける方法C++

文字列text = "私の名前はBobです";

void LongestWord(string text) 
{ 
string tmpWord = ""; 
string maxWord = ""; 

for(int i=0; i < text.length(); i++) 
{ 
    /// If founded space, rewrite word 
    if(text[i] != ' ') 
     tmpWord += text[i]; 
    else 
     tmpWord = ""; 
    /// All the time check word length and if tmpWord > maxWord => Rewrite. 
    if(tmpWord.length() > maxWord.length()) 
     maxWord=tmpWord; 
} 
cout << "Longest Word: " << maxWord << endl; 
cout << "Word Length: " << maxWord.length() << endl; 
} 
+0

このコードを仮定すると、あなたは、単に(tmpWord.length()> maxWord.length())maxWord = tmpWord場合 '交換する必要が正しい;' 'IF(tmpWord.length() user463035818

+0

私はこの変種を試しました。残念ながらそれは動作しません:( – TomRay

+1

なぜそれが動作しないのですか?あなたの試行とエラーメッセージを表示する必要があります – user463035818

答えて

0
void ShortestWord(string text) 
{ 
string tmpWord = ""; 
// The upper bound of answer is text 
string minWord = text; 

for(int i=0; i < (int)text.length(); i++) 
{ 
    /// If founded space, rewrite word 

    if(text[i] != ' ') 
    { 
     tmpWord += text[i]; 
    } 
    else 
    { 
     // We got a new word, try to update answer 
     if(tmpWord.length() < minWord.length()) 
      minWord=tmpWord; 
     tmpWord = ""; 
    } 

} 
// Check the last word 
if(tmpWord != "") 
{ 
    if(tmpWord.length() < minWord.length()) 
     minWord=tmpWord; 
} 
cout << "Shortest Word: " << minWord << endl; 
cout << "Word Length: " << minWord.length() << endl; 
} 
1

コメント欄に記載された提案は機能しますが、制御構造を再構成して機能させることに過ぎません。すなわち

for(int i=0; i < text.length(); i++) 
{ 
    /// If founded space, rewrite word 
    if(text[i] != ' ') 
     tmpWord += text[i]; 
    else 
    { 
     if(minWord.length()==0)//this only happens once 
       minWord=tmpWord;//for the first word,you need to assign minWord so you have something to compare to 

     if(tmpWord.length() < minWord.length())//move this block here 
      minWord=tmpWord; 

     tmpWord = ""; 
    } 

} 

は、私はあなたが抽出operator>>istringstreamを使用した場合、あなたがはるかに簡単に単語を確認することができ、追加される場合があります。ような何か:

#include <sstream> 
    .... 

    string text="my name is bob"; 
    string tmpWord = ""; 
    string minWord = ""; 
    istringstream ss(text);//defines the input string stream and sets text in the input stream buffer 

    while(ss.peek()!=EOF)//until the end of the stream 
    { 
     ss>>tmpWord;//read a word up to a space 

     if(minWord.length()==0)//this only happens once 
       minWord=tmpWord; 

     if(tmpWord.length() < minWord.length()) 
      minWord=tmpWord; 

    } 
1
void ShortestWord(std::string const& text) 
{ 
    std::stringstream ss(text); 
    std::vector<std::string> v(std::istream_iterator<std::string>(ss), {}); 
    auto min = std::min_element(v.begin(), v.end(), 
       [] (auto& lhs, auto& rhs) { return lhs.size() < rhs.size(); }); 
    auto p = std::make_pair(*min, min->size()); 
    std::cout << "Shortest Word: \"" << p.first << "\"\n"; 
    std::cout << "Word Length: " << p.second << '\n'; 
} 
+0

常に短く、最良の方法で作業を進めます。 !! +1 –

+0

1)デフォルトの比較では文字列を辞書的に比較します: "aaa"は "c"より小さい。 2) 'istream_iterator'は入力イテレータであり、' min_element'は少なくとも前方に1を必要とします。 –

+0

@Revolver_Ocelotが更新されました。 – 0x499602D2

0

我々は最小値と最大値の両方を取得したい場合は、初期値は、それらのそれぞれに反対する必要があります。 実際、それは 'テキスト'の最大制限文字列でなければなりません。
ビジネスアプリケーションの開発では、これは常識ですが、一部のプログラマーはこれを嫌うかもしれません。

string minWord = text; // MAX_SIZE 
string maxWord = ""; 

for(int i = 0; i < text.length(); i++) 
{ 
    /// If founded space, rewrite word 
    if(text[i] != ' ') 
     tmpWord += text[i]; 

    if(text[i] == ' ' || i == text.length()) { 
     /// All the time check word length and if tmpWord > maxWord => Rewrite. 
     if(tmpWord.length() > maxWord.length()) 
      maxWord = tmpWord; 
     if(tmpWord.length() < minWord.length()) 
      minWord = tmpWord; 

     tmpWord = ""; 
    } 
} 
関連する問題