Является ли данный текст палиндромом? - C (СИ)
Формулировка задачи:
Дана строка символов, содержащая некоторый текст. Разработать программу, которая определяет, является ли данный текст палиндромом, т. е. читается ли он слева направо так же, как и справа налево (например, "А роза упала на лапу Азора").
Решение задачи: «Является ли данный текст палиндромом?»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
bool is_palindrom(const wchar_t *str) {
wchar_t *end = (wchar_t *)str + wcslen(str) - 1;
while(str < end) {
if(*str == L' ')
++str;
if(*end == L' ')
--end;
if(towlower(*str) != towlower(*end))
return false;
++str;
--end;
}
return true;
}
int main(int argc, char *argv[]) {
setlocale(LC_ALL, "ru_RU.UTF-8");
wchar_t *str = L"А роза упала на лапу Азора";
fwprintf(stdout, L"Фраза \"%ls\" ", str);
if(true == is_palindrom(str))
fwprintf(stdout, L"является ");
else
fwprintf(stdout, L"не является ");
fwprintf(stdout, L"палиндромом.\n");
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с широкими символами и строками
- Определяем функцию
is_palindrom, которая принимает указатель на широкую строку и проверяет является ли она палиндромом - Внутри функции инициализируем указатель
endна последний символ строки, на которую указывает указательstr - Используем цикл
whileдля сравнения символов с начала и конца строки, обходя пробелы - Если символы не равны, возвращаем
false - Если все символы равны, возвращаем
true - В функции
mainустанавливаем локаль на русскую, используяsetlocale - Инициализируем широкую строку
А роза упала на лапу Азора - Выводим строку на экран с помощью
fwprintf - Вызываем функцию
is_palindromи сохраняем результат в переменной типаbool - Выводим соответствующее сообщение на экран с помощью
fwprintf - Возвращаем
EXIT_SUCCESSдля успешного завершения программы