2016-06-01 8 views
-4

私はいくつかの単語をとり、それらがスペース文字、 "、" - "を数えずに回文かどうかを調べる必要があります。palindromeプログラムの本当に奇妙な問題

 #include <iostream> 
    #include <algorithm> 
    #include <string> 
    using namespace std; 
    int main() 
    { 
     int inputs; 
     for (int i=0;i<inputs;i++) 
     {string str; 
     getline(cin, str); 
     transform(str.begin(), str.end(), str.begin(), ::tolower); 
     str.erase(remove_if(str.begin(),str.end(),','),str.end()); 
     str.erase(remove_if(str.begin(),str.end(),'-'),str.end()); 
     str.erase(remove_if(str.begin(),str.end(),' '),str.end()); 
     if (str == string(str.rbegin(), str.rend())) 
     cout << "Y "; 
     else 
     cout << "N "; } 

} 

問題:/usr/include/c++/4.9/bits/stl_algobase.h:71:0からインクルードファイルで 、/usr/include/c++/4.9/bits/char_traits.hから: 39、from /usr/include/c++/4.9/ios:40、from /usr/include/c++/4.9/ostream:38、/usr/include/c++/4.9/iostream:39、from solution.cc:1 :/ usr/include/C++/4.9/bits/predefined_ops.h: 'boolのインスタンス化で__gnu_cxx :: __ ops :: _ Iter_pred < _Predicate ::(_Iterator)[_Iterator = __gnu_cxx :: __ normal_iterator>; (_ForwardIterator、_ForwardIterator、_Predicate)[_ForwardIterator = __gnu_cxx :: __ normal_iteratorを使用して、_ForwardIteratorから_ForwardIterator、_ForwardIterator、_ForwardIterator、_Predicate = char] ':/ usr/include/C++/4.9/bits/stl_algo.h:866:28が必要です。 _FIter std :: remove_if(_FIter、_FIter、_Predicate)[_FIter = __gnu_cxxを指定すると、_Predicate = __gnu_cxx :: __ ops :: _ Iter_pred] '/ usr/include/C++/4.9/bits/stl_algo.h:937:47: :: __ normal_iterator>; _Predicate = char] 'solution.cc:12:49:ここから必要です/ usr/include/C++/4.9/bits/predefined_ops.h:231:30:エラー:式を関数として使用できません{return bool(_M_pred( *__それ)); }^

(私に完全なジバリッシュ) すべての解決策はありますか?あなたが望むよう回文ため

+0

各単語または一連の単語をテストしていますか。私は境界が何であるか不明です。 –

+1

C++でこれを行い、アルゴリズムを使いたければ、これは 'std :: reverse'と' std :: remove_if'を使った5行または6行のプログラムです。 – PaulMcKenzie

+1

[小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) –

答えて

2

を使用し、入力として複数の単語を取得するには、同様にあなたの試みに劇的に対照的解決策が表示される場合があります空白と句読点を削除するにはerase/remove_ifイディオムを使用します。

+1

私は本当にあなたに+1を与えたいが、[名前空間stdを使うことは貧しい習慣である](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad- – Serdalis

+0

@Serdalisこのモジュールと同じくらい小さなモジュール内で使用するのは悪いことではありません。ヘッダーファイルを使用すると、ヘッダーがインクルードされてしまい、望ましくないことが起こります。 – PaulMcKenzie

+0

私はC++ソースファイルの先頭にそれを含めると、人を傷つけるのをまだ見てきました。ほとんどの場合、小さなヘルパー関数などがあります。ただ私が持っている話題から離れてペットの憎しみは、この答えはまだ素晴らしいです。 (今は+1)。 – Serdalis

3

チェックは修正

#include <iostream> 
#include <algorithm> 
#include <string> 

int main() { 

    std::string str, rStr; 

    std::cout << "Enter String :\n"; 
    std::cin >> str; 

    std::transform(str.begin(), str.end(), str.begin(), ::tolower); 
    rStr = str; 
    std::reverse(begin(str), end(str)); 

    (rStr == str) ? std::cout << "Word is palindrone\n" : std::cout << "Word is not palindrone\n"; 

    return 0; 
} 

ような単純なことができます。

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cctype> 

int main() 
{ 
    std::string orig; 
    while (std::getline(std::cin, orig)) 
    { 
     std::transform(orig.begin(), orig.end(), orig.begin(), ::toupper); 

     // erase the punctuation and spaces 
     orig.erase(std::remove_if(orig.begin(), orig.end(), [](char ch) 
     { return ::isspace(ch) || ::ispunct(ch);}), orig.end()); 

     std::cout << ((orig == std::string(orig.rbegin(), orig.rend()))?"Y":"N"); 
    } 
} 

std::reverseが必要とされなかったことに注意してください、との使用:

getline(cin, str);

+1

thx 4ヘルプマン。 –