В этом операторе
if (word.at(i) == word.length() - 1)
правое выражение оператора сравнения никогда не изменяется и имеет тип std::string::size_type
вместо типа cha
r. Вы имеете в виду
if (word.at(i) == word.at( word.length() - 1 - i ))
Однако нет смысла использовать функцию-член в. Вы можете использовать индекс оператора. Например,
if ( word[i] == word[word.length() - 1 - i ] )
И цикл должен иметь итерации word.length () / 2.
Также внутри цикла вы перезаписываете переменную result. Таким образом, вы всегда возвращаете последнее значение переменной. Может быть равно true, хотя строка не является палиндромом.
Также параметр должен быть ссылочным типом. В противном случае создается избыточная копия переданного аргумента.
Функция может быть определена следующим образом
bool isPalindrome( const std::string &word )
{
std::string::size_type i = 0;
std::string::size_type n = word.length();
while ( i < n / 2 && word[i] == word[n - i - 1] ) i++;
return i == n / 2;
}
Другой подход заключается в следующем
bool isPalindrome( const std::string &word )
{
return word == std::string( word.rbegin(), word.rend() );
}
Хотя этоПодход требует создания обратной копии исходной строки.
Самый простой способ - использовать стандартный алгоритм std::equal
. Вот демонстрационная программа
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
bool isPalindrome( const std::string &word )
{
return std::equal( std::begin( word ),
std::next( std::begin( word ), word.size() / 2 ),
std::rbegin( word ) );
}
int main()
{
std::cout << isPalindrome( "123454321" ) << '\n';
return 0;
}