字符串回文得到分段错误

时间:2011-10-15 00:36:33

标签: c segmentation-fault

为了好玩,我写了一个函数来检查给出的字符串是否是回文。当我运行prog时,它会抛出分段错误。任何人都可以点亮它。

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;
}

由于 萨姆


根据以下建议更改代码:

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 个答案:

答案 0 :(得分:2)

几点:

  • 字符串的空终止符为'\0',而不是'/0'
  • sizeof(char) 总是 1,您无需乘以它。
  • 您应该始终为字符串分配足够的空间,例如使用strlen(s) + 1
  • 你不应该从C中malloc转换返回值,它会隐藏一些你最不了解的错误。
  • 因为你逐渐减少len来填充反向字符串,它将最终为0,不能用于将null终止符放在该字符串的 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,所以你填充索引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);

答案 1 :(得分:0)

其中包含len个字符的字符串需要len+1个字符的缓冲区,因为末尾有空字符。

答案 2 :(得分:0)

试试这个。我刚刚对它进行了测试并且有效。

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;

}