为了好玩,我写了一个函数来检查给出的字符串是否是回文。当我运行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;
}
我还有问题。分段错误已消失,但反向字符串为空。
答案 0 :(得分:2)
几点:
'\0'
,而不是'/0'
。sizeof(char)
总是 1,您无需乘以它。strlen(s) + 1
。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;
}