Создание программы, которая реализует функции, которые работают с массивами - PullRequest
3 голосов
/ 05 марта 2020

Выполняю задание, в котором мне нужно реализовать некоторые функции. Одна из этих функций - проверить, является ли строка палиндромом.

#include <stdio.h>
#include <stdlib.h>

char string[] = "cameron";
char string2[] = "mah";
char palindrome[] = "madam";
char notPalindrome[] = "music";

int removeChar(char *str1, char * str2, char c){
   int length = 0;
   for (int i = 0; str1[i] != '\0'; i++){
        length++;
   }
   for (int i = 0; i <= length; i++){
      if (str1[i] == c){
         str2[i] = '*';
      }
      else {
         str2[i] = str1[i];
      }
   }
   for (int i = 0; i<= length; i++){
    printf("%c", str2[i]);
   }
}

int isPalindrome(char *str){
   int length = 0;
   for (int i = 0; str[i] != '\0'; i++){
        length++;
   }
   int j = length - 1;
   int reversible = 0;
   for (int i = 0; i < j; i++){
      if (str[i] != str[j]){
         reversible++;
         break;
    }
      j--;
   }
   if (reversible > 0){
    printf("\nString is not a palindrome\n");
   }
   else {
    printf("\nString is replaceable\n");
   }
}

int main(){
  removeChar(string, string2, 'm');
  isPalindrome(palindrome);
  return 0;
}

Когда я запускаю этот код, он говорит, что строка не является палиндромом, когда это должно быть, но почему, если я изменяю isPalindrome(palindrome); на isPalindrome("madam");, она работает.

Кроме того, почему, если я закомментирую //removeChar(string, string2, 'm');, isPalindrome() будет работать правильно.

1 Ответ

5 голосов
/ 05 марта 2020

У вас переполнение буфера. removeChar неявно предполагает, что str2 имеет ту же длину, что и str1. Поэтому, когда вы запустите это:

for (int i = 0; i <= length; i++){
      if (str1[i] == c){
         str2[i] = '*';
      }
      else {
         str2[i] = str1[i];
      }
}

с str1, являющимся "cameron" и str2, являющимся "mah", вы go выйдете за границы str2 и в память, где palindrome хранится. Таким образом, после запуска removeChar(string, string2, 'm');, char[], который раньше содержал mah\0, теперь содержит ca*e, а char[], который раньше содержал madam\0, теперь ron\0m\0. Очевидно, "ron" не является палиндромом. Попробуйте напечатать значения ваших строк после removeChar(string, string2, 'm');, и вы должны увидеть это в действии.

Единственная причина, по которой вам вообще разрешено делать это без ошибки сегментации, заключается в том, что вы используете char[] вместо char*, кстати. Вы можете предпочесть использовать указатели над массивами, чтобы такие вещи не прерывались молча.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...