В этих циклах
for(int count; count <= length; count++ ){
def[count] = str[count];
}
и
for(int count2; count2 <= length; count2++){
if(str[count2] != def[count2]){
return 0;
}
return 1;
}
используются неинициализированные переменные count
и count2
. Таким образом, функция имеет неопределенное поведение.
Обратите внимание, что функция объявлена и определена неправильно. Он слишком сложен и использует магическое число SIZE
.
. Кроме того, вы должны использовать тип size_t
вместо типа int, поскольку тип возвращаемого значения функции strlen
равен size_t
и вообщеобъект типа int
не может вместить объект типа size_t
.
Нет необходимости создавать вспомогательный массив и изменять исходную строку, чтобы проверить, является ли данная строка палиндромом. Кроме того, параметр должен быть определен с квалификатором const
. В противном случае вы не сможете проверить, является ли строковый литерал палиндромом, поскольку изменение строкового литерала вызывает неопределенное поведение.
Также, если вы пытаетесь использовать указатели, нет необходимости использовать также индексы в циклах.
Функция может быть определена гораздо проще.
Вот, пожалуйста.
#include <stdio.h>
#include <string.h>
_Bool isPalindrome( const char *s )
{
const char *first = s, *last = s + strlen( s );
if ( first != last )
{
while ( first < --last && *first == *last ) ++first;
}
return !( first < last );
}
int main(void)
{
char *s1 = "121";
printf ( "\"%s\" is %s%s\n", s1, isPalindrome( s1 ) ? "a " : "not ", "palindrome." );
char *s2 = "1221";
printf ( "\"%s\" is %s%s\n", s2, isPalindrome( s2 ) ? "a " : "not ", "palindrome." );
return 0;
}
Выход программы:
"121" is a palindrome.
"1221" is a palindrome.
Как вы можете видетьфункция использует только указатели и ни один индекс.