палиндром струны получает ошибку сегментации - PullRequest
1 голос
/ 15 октября 2011

Просто для удовольствия я написал функцию, чтобы проверить, является ли данная строка палиндромом. Когда я запускаю прогу она выдает ошибку сегментации. Может ли кто-нибудь пролить свет на это.

int palindrome( const char *input )         
{    
  char * reverse;    
  int len     = 0 ;     
  int i       = 0;     
  bool result = false;    
  len         = strlen(input);    

  if( len <= 1)   
    return  -1;     
  reverse  = (char *)malloc( sizeof ( char)* len);     
  printf( " the len of character is %d", len);        
  while( input[i++] != '/0')     
  {     
     reverse[ --len] = input[i];         
  }
  reverse[len] = '/0';

 printf(" the reverse string is %s", reverse);
 if( !strcmp( input, reverse) )
   return 1;
 else
 return 0;
}

Спасибо Sam


Изменение кода в соответствии с предложениями:

int palindrome( const char *input )         
{    
  char * reverse;    
  int len     = 0 ;     
  int i       = 0;     
  bool result = false;    
  len         = strlen(input)+1;    

  if( len <= 2)   
    return  -1;     
  reverse  = (char *)malloc(len);     
  printf( " the len of character is %d", len); 
  reverse[len] = '\0' ;      
  while( input[i++] != '\0')     
  {     
     reverse[ --len] = input[i];         
  }

 printf(" the reverse string is %s", reverse);
 if( !strcmp( input, reverse) )
   return 1;
 else
 return 0;
}

У меня все еще есть проблема. Ошибка сегментации исчезла, но обратная строка пуста.

Ответы [ 3 ]

2 голосов
/ 15 октября 2011

Несколько баллов:

  • нулевой терминатор для строк - '\0', а не '/0'.
  • sizeof(char) - это всегда 1, вам не нужно умножать на него.
  • вы всегда должны выделять достаточно места для строки и ее нулевого терминатора, например с strlen(s) + 1.
  • Вы не должны приводить возвращаемое значение из malloc в C, оно скрывает определенные ошибки, о которых вам лучше знать.
  • , так как вы постепенно уменьшаете len для заполнения обратной строки, он будет равен 0, и его нельзя будет использовать для установки нулевого терминатора в end этой строки. Вероятно, это немедленная причина вашего дампа памяти, так как вызов strcmp для строки, не заканчивающейся нулем, является плохой идеей.
  • на самом деле вообще не нужно создавать перевернутую строку, вы можете просто проверить первый и последний символы, затем второй и второй до последнего и т. Д. (Пока они не встретятся в середине или не пересекаются).

В последнем пункте я имею в виду что-то вроде (псевдокод):

def isPalindrome (str):
    left = 0
    right = strlen(str) - 1
    while left < right:
        if str[left] <> str[right]:
            return false
        left = left + 1
        right = right - 1
    return true

И, с обновлением, у вас есть правильная идея, установить нулевой терминатор перед уменьшением len.

Но поскольку len теперь является длиной строки плюс единица, вы заполняете индексы с 1 по LEN, а не с 0 по LEN-1.

Изменение:

reverse[len] = '\0';

до:

reverse[--len] = '\0';

Или, что еще лучше, измените его так, чтобы len оставалось длиной строки (для printf):

len = strlen (input) + 1;
:
reverse = malloc (len);

до:

len = strlen (input);
:
reverse = malloc (len + 1);
0 голосов
/ 15 октября 2011

Попробуй это. Я только что проверил, и это работает.

int palindrome( const char *input )         
{    
char * reverse;    
int len     = strlen(input);     
int i       = 0;     

if( len <= 1)   
    return  -1;

reverse  = (char *)malloc( sizeof(char) * len + 1);     
printf( " the len of character is %d", len);        
reverse[len--] = '\0';
while( input[i] != '\0')     
{     
    reverse[len--] = input[i++];         
}

printf(" the reverse string is %s", reverse);
if( !strcmp( input, reverse) )
    return 1;
else
    return 0;

}

0 голосов
/ 15 октября 2011

Строка с len символами нуждается в буфере len+1 символов из-за нулевого символа в конце.

...