我正在编写一个程序来检查字符串是否是回文或使用递归.Palindrome字符串是可以向后读取的字符串,与向前读取字符串相同。但以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
printf("Enter the number of characters in your string\n");
scanf("%d",&num);
char string[num];
char string2[num];
int i;
printf("Enter your string\n");
for (i=0;i<num;i++)
{
scanf("%c",&string[i]);
}
fillString(string,string2,num);
int palin = isPalind(string,string2,num);
if (palin) printf("The string you entered is palindrome");
else printf("The string you entered is not palindrome");
return 0;
}
int isPalind(char string[],char string2[],int num)
{
int i=0;
while (i<num)
{
if (string[i]!=string2[i])
{
i++;
return 0;
}
else{
i++;
return 1*isPalind(string,string2,num);
}
}
}
void fillString(char string[],char string2[],int num)
{
int i;
for (i=1;i<num;i++)
string2[i-1]=string[num-i];
}
我有一个逻辑错误,程序编译好并执行但它总是发出“字符串不是回文”
答案 0 :(得分:1)
在fillString
中,循环正在迭代num-1
次(i
从1
到num-1
),因此不会复制整个字符串。省略原始字符串的第一个字符。你应该做
for (i=1;i<=num;i++) ...
至于递归函数,它实际上并不是递归的。在递归调用中,应该传递修改输入,但在您的情况下,传递完全相同的输入。因此,如果是真正的回文,很可能由于非终止而导致堆栈溢出。我会提出另一种方法,递归地使用单个字符串:
1)基本情况:如果长度为0或1,则字符串为回文结构
2)递归步骤:如果第一个字符等于最后一个而字符串没有,则字符串是回文,最后一个字符是回文。
答案 1 :(得分:0)
这两个功能都是错误的。它们可以按以下方式编写
int isPalind( const char string[], const char string2[], int num )
{
return ( num == 0 ) ||
( string[0] == string[--num] && isPalind( string + 1, string2, num ) );
}
void fillString( const char string[], char string2[], int num )
{
int i;
for ( i = 0; i < num; i++ ) string2[i] = string[num-i-1];
}
如果您不需要递归函数,那么您可以使用简单的函数memcmp
来确定两个字符串是否相等。
答案 2 :(得分:0)
你的fillString()函数是否按预期反转你的字符串?看起来string1的第一个字母没有被添加到string2的最后一个位置,因为for循环在i&lt; num失败。尝试将其切换到i&lt; = num并查看是否有帮助。
仔细检查此示例:
void fillString(char string[],char string2[],int num)
{
int i;
for (i=1;i<num;i++)
string2[i-1]=string[num-i];
}
当i = 4时,你有string2 ='olle'。当i = 5时,for循环条件失败,因此它不会填充string2 [4] ='H'。
void fillString(char string[],char string2[],int num)
{
int i;
for (i=1;i<=num;i++)
string2[i-1]=string[num-i];
}