#include <cstring>
#include <cctype>
#include <iostream>

bool YPalindrome(const char* candidate)
{
    const char* left = candidate;
    const char* right = candidate + std::strlen(candidate) - 1;

    while (left <= right)
    {
        bool leftAlpha = std::isalpha(*left);
        bool rightAlpha = std::isalpha(*right);

        if (leftAlpha && rightAlpha) // only compare alphabetic characters.
        {
            if (std::tolower(*left) != std::tolower(*right))
                return false;

            ++left, --right;
        }
        else
        {
            if (!leftAlpha) // skip non-alphabetic characters.
                ++left;

            if (!rightAlpha)
                --right;
        }
    }

    return true;
}

void reportIfPalindrome(const char* s)
{
    std::cout << '"' << s << "\" ";

    if (YPalindrome(s))
        std::cout << "is a palindrome.\n";
    else
        std::cout << "is not a palindrome.\n";
}

int main()
{
    const unsigned phrases = 4;
    const char* str [phrases] =
    {
        "Madam, I'm Adam.",
        "Ra cecar",
        "not a palindrome",
        "A man, a plan, a canal - Panama!"
    };

    for (unsigned i = 0; i < phrases; ++i)
        reportIfPalindrome(str[i]);
}