Функция палиндрома, не возвращающая значение в C - PullRequest
0 голосов
/ 31 октября 2019

Когда я запускаю эту функцию, я не получаю возвращаемого значения 1 или 0. Я не уверен, почему, я новичок в указателях, и любой тип помощи / подсказок будет с благодарностью.

int isPalindrome (char * str)
{
    char def[SIZE];
    int length = strlen(str);
    for(int count; count <= length; count++ ){
        def[count] = str[count];
    }

    int c;
    char *begin, *end, temp;

    begin  = str;
    end    = str;

    for (c = 0; c < length - 1; c++)
        end++;

    for (c = 0; c < length/2; c++)
    {        
        temp   = *end;
        *end   = *begin;
        *begin = temp;

        begin++;
        end--;
    }

    for(int count2; count2 <= length; count2++){
        if(str[count2] != def[count2]){
            return 0;
        }
        return 1;
    }
}

Функция вызывается с помощью ..

 if(isPalindrome(arr) == 1) 
     printf ("\nIs a palindrome.\n\n");

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Ваша программа имеет несколько проблем. Давайте посмотрим на них один за другим:

for(int count; count <= length; count++ ){
            ^^^^
    def[count] = str[count];
}

Вы не инициализируете счет, вы просто объявляете его. Без какого-либо начального значения счетчик будет просто мусором. Чтобы исправить это:

for(int count = 0; count <= length; count++ ){
    def[count] = str[count];
}

Обратите внимание, что более старые версии C требуют, чтобы вы объявили все переменные в начале функционального блока, насколько я помню. Так что это в любом случае неправильно.

Далее, ваша логика палиндрома неверна. Вы просто меняете символы между началом и концом.

Все, что вам нужно сделать, это проверить во время итерации ПОЛУЧИТЬ СТРОКУ, равны ли символы с начала до конца.

for (c = 0; c < length/2; c++)
{
    // Check if "begin" equals to the current "end"
    if (*begin != *end) 
    {
        return 0;
    }

    // Move "begin" forward and "end" backwards
    begin++;
    end--;
}

Вот ваша полная функция в рабочем состоянии:

int isPalindrome(char* str)
{
    int length = strlen(str);

    int c;
    char *begin, *end;

    begin = str;

    // Why use the below for loop when you can directly move end to the end?
    end = str + length - 1;

    // for (c = 0; c < length - 1; c++)
    //    end++;

    for (c = 0; c < length / 2; c++) {
        if (*begin != *end) {
            return 0;
        }

        begin++;
        end--;
    }
    return 1;
}
0 голосов
/ 31 октября 2019

В этих циклах

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.

Как вы можете видетьфункция использует только указатели и ни один индекс.

0 голосов
/ 31 октября 2019

Чтобы проверить, является ли строка палиндромом, вы создаете перевернутую строку, предварительно выделив достаточно места для всех символов, перебирая исходную и изменяя порядок. затем вы можете использовать команду strcmp, чтобы проверить, совпадают ли обратная и исходная строки.

int isPalindrome (char * str)
{
  int length = strlen(str); 
  char* reversed = malloc(sizeof(char)*length); //we allocate enough space for length chars

  for(int i = 0; i < length; i++) {
    reversed[i] = str[length-1-i]; //populate reversed with the chars in str but in the reversed order
  }

  if(strcmp(str,reversed) == 0) //strcmo(a,b) return 0 if they are equal
  {
    free(reversed); //deallocate the space for reversed
    return 1;
  }
  free(reversed); //deallocate the space for reversed
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...