palindrome print backwards
Aug 10, 2019 at 11:47am UTC
This program should check if the input is a (case and space insensitive) palindrome.
If not, the reversed input should be printed.
It works as it should, the only thing is that I would like to see the
reversed print with spaces included, as the spaces are automatically trimmed
due to line 10.
Is that a way to do so?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#include <iostream>
#include<string>
#include<algorithm>
#include<cctype>
using namespace std;
void palindrome(string a)
{
a.erase(std::remove_if(a.begin(), a.end(),
[](unsigned char c) { return std::isspace(c); }), // space insensitive
a.end());
transform(a.begin(), a.end(), a.begin(), ::tolower); //case insensitive
if (a == string(a.rbegin(), a.rend()))
{
cout << "this is a palindrome" << endl;
}
else
{
cout << "not a palindrome" << endl;
reverse(begin(a), end(a));
cout << a << '\n' ;
}
}
int main()
{
char answer;
do
{
string b;
cout << "enter a string" << endl;
getline(cin, b);
palindrome(b);
cout << "try again(Y/N)?" << endl;
cin >> answer; cin.ignore(1000, '\n' );
} while (answer == 'Y' || answer == 'y' );
return 0;
}
Last edited on Aug 10, 2019 at 11:47am UTC
Aug 10, 2019 at 12:09pm UTC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#include <iostream>
#include <string>
#include <cctype>
#include <iomanip>
// remove spaces, make all lower case
std::string clean( const std::string& str )
{
std::string result ;
for ( unsigned char c : str ) if ( !std::isspace(c) ) result += std::tolower(c) ;
return result ;
}
void print_pal_result( const std::string& str )
{
const auto cleaned = clean(str) ;
if ( cleaned == std::string{ cleaned.rbegin(), cleaned.rend() } )
std::cout << "string " << std::quoted(str) << " is a palindrome\n" ;
else
{
std::cout << " string " << std::quoted(str) << " is not a palindrome\n"
<< "reverse is " << std::quoted( std::string{ str.rbegin(), str.rend() } ) << '\n' ;
}
}
bool again()
{
std::cout << "try again? " ;
char answer ;
std::cin >> answer ;
return answer == 'y' || answer == 'Y' ;
}
int main()
{
do
{
std::cout << "enter a string: " ;
std::string str ;
while ( str.empty() ) // skip empty input lines
std::getline( std::cin, str ) ;
print_pal_result(str) ;
}
while ( again() ) ;
}
Last edited on Aug 10, 2019 at 12:17pm UTC
Aug 11, 2019 at 10:08pm UTC
Would also suggest using std::string_view instead of simply std::string or const std::string&.
Aug 12, 2019 at 8:49am UTC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
bool isPalindrome( const string &s )
{
int p = 0; int q = s.size() - 1;
while ( true )
{
while ( p < s.size() && !isalnum( s[p] ) ) p++;
while ( q >= 0 && !isalnum( s[q] ) ) q--;
if ( p >= q ) return true ;
if ( tolower( s[p++] ) != tolower( s[q--] ) ) return false ;
}
}
int main()
{
char ans = 'y' ;
while ( tolower( ans ) == 'y' )
{
string test;
cout << "Input something: " ;
getline( cin >> ws, test );
if ( isPalindrome( test ) ) cout << "Palindrome\n" ;
else cout << string( test.rbegin(), test.rend() ) << '\n' ;
cout << "Again? (y/n): " ; cin >> ans;
}
}
Topic archived. No new replies allowed.