Not factoring in uppercase...

Here is a code that I previously worked on. I couldn't get the part about ignoring or tolower conversion correct in this program when figuring out the palindrome part.

example, Madam I'm Adam
output:
madam i'm adam is not a palindrome //wrong It is factoring in the special characters but not the uppercase.

Just curious what should be fixed in the program to correct this part?

Thanks!

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  #include<iostream> 
#include<string> 
#include<ctype.h> 
#include<stdio.h> 
using namespace std; 

//prototype of functions 
bool is_palindrome(string&, int, int); 
string Reverse(string, string); 
string remove_char(string);

int main() 
{ 

//variable declarations 
string userInput; 
string sentence2; 
int first = 0; 
size_t last = string::npos; 
int userchoice; 
string reversed,r;
locale loc; 
string answer; 

//Loop to keep program running until user quits 
do 
{ 
//Reverse function 
cout<< "Do you want to reverse a string(1), determine if it is a palindrome(2) or quit:" << endl; 
cin >> userchoice; 
cout<< userchoice<< endl; 
getline(cin, userInput); 
if (userchoice ==1) 
{ 
cout<< " Please enter a word or sentence, I will reverse it:" <<endl; 
cin>>userInput; 

//to lowercase 
string str= userInput; 
for (size_t i=0; i<str.length(); ++i) 
cout << tolower(str[i],loc); 
cout << endl;
cout<< Reverse(userInput, reversed) << " is a reversed." << endl; 
} 

//pallindrome function 
if (userchoice ==2) 
{ 
cout<< " Please enter a word or sentence, I will determine if it is a palindrome or not:" <<endl; 
cin>>userInput; 
string str= userInput; 

sentence2 = remove_char(userInput);

for (size_t i=0; i<str.length(); ++i) 
cout << tolower(str[i],loc); 
cout<< (is_palindrome(sentence2, first, last) ? " is a palindrome." : " is not a palindrome.") << endl; 
cin.get(); 
} 
cout<< "Do you want to try again:" << endl; 
cin>> answer; 

}while (answer == "yes"); 
return 0; 
} 

//Functions 

string remove_char(string userInput)
{
        string sentence2;

        for (unsigned int x=0; x < userInput.length(); x++)
        {
                if (isalnum(userInput[x]))
                {
                        sentence2 += userInput[x];
                
                }
        }
        return sentence2;
}

bool is_palindrome(string& sentence2, int first = 0, int last = string::npos) 
{ 
if(last == string::npos) 
{ 
last = (sentence2.length()-1); 
} 
if (sentence2[first] == sentence2[last]) 
{ 
if ((first-last)== 0) 
{ 
return true; 
} 
else if (first ==(last-1)) 
{ 
return true; 
} 
else 
{ 
return is_palindrome(sentence2, first+1, last-1); 
} 
} 
else 
{ 
return false; 
} 
} 

string Reverse(string word, string reversed) 
{ 
if(word.length() == 0) 
{ 
return reversed; 
} 
else 
{ 
string temp; 
reversed = word.substr(0,1) + reversed; 
temp = word.substr(1); 
return Reverse(temp, reversed); 
} 
}
I see where you cout << tolower(), but you do not store what tolower() returns. You need to overwrite the characters in the original string and it should work.
so I think what you are saying is that I should have reassigned sentence2 to a equal to a new variable after the coversion and then used that variable in the function call?

for example

after the conversion to lowercase....

1
2
3
4
5
sentence2 = sentence3

cout<< (is_palindrome(sentence3, first, last) ? " is a palindrome." : " is not a palindrome.") << endl; 
cin.get(); 
} 


***nevermind that didnt work.

Can you show me where in the code I needed to correct this part?
Thank you
Last edited on
Change
cout << tolower(str[i],loc);
to
1
2
str[i] = tolower(str[i],loc);
cout << str[i];

I think there is two places where you need to do that.
Basically tolower has a return value and you need to store that return value back to the string.
Topic archived. No new replies allowed.