Void swap(char& vl, char& v2);
// Меняет местами значения переменных vl и v2.
string reverse(const string& s);
// Возвращает копию s с символами, расположенными в обратном порядке.
string remove_punct(const string& s, const string& punct);
// Возвращает копию s, из которой удалены все вхождения символов
// строки punct.
string make_lower(const string& s);
// Возвращает копию s, в которой все буквы верхнего регистра
// переведены в нижний, а остальные символы остались без изменений.
bool is_pal(const string& s);
// Возвращает true, если строка является палиндромом.
// и false в противном случае.
Int main()
{
string str;
cout <<"Enter a candidate for palindrome test\n"
<<"followed by pressing Enter An";
getline(cin,str);
if (is_pal(str))
cout << "\"" « str + "\" is a palindrome.";
else
cout <<"\"" « str + "\" is not a palindrome.";
cout <<endl;
return 0; }
Void swap(char& v1, char& v2)
{
char temp = v1;
v1 = v2;
v2 = temp;
}
string reverse(const string& s)
{
int start = 0;
int end = s.length();
string temp(s);
while (start < end)
{
end--;
swap(temp[start], temp[end]);
start++; }
return temp;
}
// Используем библиотеки классов cctype и string.
string make_lower(const string& s)
{
string temp(s);
for (int i =0; i < s.length(); i++)
temp[i] = tolower(s[i]);
return temp; }
string remove_punct(const string& s, const string& punct)
{
string no_punct; // Инициализируется пустой строкой.
int s_length = s.length();
int punct_length = punct.lengthO;
for (int i = 0; i < s_length; i++)
{
// Извлечение очередного символа из строки s.
string a_char = s.substr(i,1);
// Поиск вхождения очередного символа строки s в строке punct.
int location = punct.find(a_char, 0);
if (location < 0 || location >= punct_length)
no_punct = no_punct + a_char; // a_char отсутствует
// в punct. сохраняем его. }
return no_punct; }
// Используем функции make_lower, remove_punct.
Bool is_pal(const string& s)
{
string punct(",;:.?!'\" "); // Включает пробел.
string str(s);
str = make_lower(str);
string lower_str = remove_punct(str, punct);
return (lower_str == reverse(lower_str)); }
Примеры диалога
Enter a candidate for palindrome test
followed by pressing Enter.
Madam, I'm Adam.
"Madam. I'm Adam." is a palindrome.
Enter a candidate for palindrome test
followed by pressing Enter.
Radar
"Radar" is a palindrome.
Enter a candidate for palindrome test
followed by pressing Enter.
Am I a palindrome?
"Am I a palindrome?" is not a palindrome.
Взаимное преобразование объектов типа string и строк С
Как вы знаете, C++ выполняет автоматическое преобразование типов, позволяющее присваивать строки С переменным типа string. Например, приведенный ниже код является абсолютно правильным.
char a_c_string[] = "This is my С string.";
string string_variable;
string_variable = a_c_string;
А вот такой оператор:
a_c_string = string_variable; // НЕДОПУСТИМО
вызовет вывод компилятором сообщения об ошибке.
Недопустим и следующий оператор:
strcpy(a_c_string. string_variable); // НЕДОПУСТИМО
Функция strcpy не может принимать в качестве второго аргумента объект типа string, и C++ не выполняет автоматического преобразования объектов string в строки С, что является реальной проблемой.
Для получения строки С, соответствующей объекту string, нужно выполнить явное преобразование типов. Это можно сделать с использованием функции-члена c_str(). Вот как правильно произвести копирование объекта string в строку С:
strcpy(a_c_string, string_variable.c_str()); // ДОПУСТИМО
Обратите внимание, что копирование нельзя выполнить без помощи функции strcpy. Функция-член c_str() возвращает строку С, соответствующую вызывающему объекту string. Как уже говорилось ранее, оператор присваивания не работает со строками С. Поэтому если вы полагаете, что следующий оператор:
a_c_string = string_variable.c_str(); // НЕДОПУСТИМО
может выполнить копирование строки из переменной типа string в строку С, то это не так. И мы подчеркиваем, что такой оператор недопустим.