C语言中的回文递归程序

C语言中的回文递归程序,c,recursion,palindrome,C,Recursion,Palindrome,我已经想出了如何绕过绳子的办法,但我似乎无法让它发挥作用。 也许是因为我用的是scanf。 请告知:) #包括 #包括 int do_回文(字符*str,int偏移量){ int ok=1; int长度=strlen(str); 如果(长度/2>0) ok=(str[0]==str[length-1-offset])? do_回文(++str,+++offset):0; 返回ok; } int main(){ int i=0; int ok=0; char*str[1]; scanf(“%c”,

我已经想出了如何绕过绳子的办法,但我似乎无法让它发挥作用。 也许是因为我用的是scanf。 请告知:)

#包括
#包括
int do_回文(字符*str,int偏移量){
int ok=1;
int长度=strlen(str);
如果(长度/2>0)
ok=(str[0]==str[length-1-offset])?
do_回文(++str,+++offset):0;
返回ok;
}
int main(){
int i=0;
int ok=0;
char*str[1];
scanf(“%c”,str[1]);
ok=do_回文(str[0],0);
printf(“%s是回文?:%d\n”,str[0],ok);
printf(“完成!”);
返回0;
}
声明一个字符指针数组

scanf("%c", str[1]);
读取单个字符,但尝试将其放置在数组末尾之外(C数组是基于零的)

我认为您需要读取字符串(字符数组)。您可以使用

char str[20]; /* change the array size as required */
scanf("%19s", str); /* read one fewer chars than your array size */

你想的是结构黑客:

typedef struct {
    char s[1];
} String;

int main()
{
    /* allocate 15 extra bytes for the string */
    String *s = malloc(sizeof *s + 15);
这允许您声明一个大小为1的数组,然后将其用作可变长度,但您仍然需要给它一些内存(通过malloc)才能使用它。然后您可以通过
s
访问它

如果您想要一个可变长度的字符串,您应该malloc所需的数据量。如果您想做得有点粗糙(如果您打算用Gcc编译),您可以这样做:

char * str;
scanf("%ms", str);
ok = do_palindrome(str, 0);
printf("%s is palindrome? : %d\n", str, ok);
free(str);
您试图将字符串读入char类型,这是错误的,应该是string类型。另外,对
do_palindrome
的子例程调用应该包含
str
的基址,而不仅仅是字符串的第一个字符

if(length/2 > 0)
    ok = (str[0] == str[length - 1 - offset]) ?
            do_palindrome(++str, ++offset):0;
此语句将运行
(长度-1)
次。当我们检查回文时,我们只需要做
(length/2)
比较。因此,我建议将代码更改为以下内容:

if (length >= 2 && (length / 2) >= offset) {
    ok = (str[0] == str[length - 1 - offset]) ?
            isPalindrome(++str, ++offset) : 0;

scanf(“%c”,str[1])?只有一个字符?您需要输入字符串来检查回文,不是吗?OT:每次调用时重复strlen()一点也不优雅。把剩余长度作为递归参数而不是偏移量传递怎么样?是的,我的错。如果我将代码初始化为:'char*str[]={“sasaki”,“SOS”,“12344321”,“1234322”,“555”,“0”,“ikki”},程序就会工作我想我应该扫描%s到str[0],但这仍然不起作用。如果使用缩进和代码格式,没有人会皱眉,事实恰恰相反。我以为char*str[1]应该包含一个字符串?即使我将其更改为20,程序仍然无法工作:(代码仅在初始化字符串时有效,但在扫描字符串时无效。您需要分配内存来保存字符串。您可以在堆栈-
char str[20]
或堆-
char*str=malloc(20)上执行此操作)
如果我将代码初始化为:'char*str[]={“sasaki”、“SOS”、“12344321”、“1234322”、“555”、“0”、“ikki”};'我想我应该扫描%s到str[0],程序就会工作但这仍然不起作用。原始代码如下:@AminHusni您想处理单个字符串还是字符串数组?您最近的注释和代码,如
char*str[]
提供字符串数组,但您的程序看起来只需要一个字符串。实际上,我想处理一个字符串。根据最初的7字符串程序,我似乎无法理解如何处理一个字符串而不是7。我非常感谢您的帮助。
char* str[10] ;
scanf("%s", str);
ok = do_palindrome(str, 0);
printf("%s is palindrome? : %d\n", str, ok);
if(length/2 > 0)
    ok = (str[0] == str[length - 1 - offset]) ?
            do_palindrome(++str, ++offset):0;
if (length >= 2 && (length / 2) >= offset) {
    ok = (str[0] == str[length - 1 - offset]) ?
            isPalindrome(++str, ++offset) : 0;