我的C程序是无限递归的,我不知道为什么

我的C程序是无限递归的,我不知道为什么,c,recursion,C,Recursion,这个程序应该从一个用户那里获取一个名称,并将其向后输出。我们的教授说,我们必须使用递归,而我正在努力避免无限递归。请帮忙 #include <stdio.h> #include <string.h> void reversedWord(char input[],int size) { int count; int count2; if(count==0) { count2=size; } count2=count2-1

这个程序应该从一个用户那里获取一个名称,并将其向后输出。我们的教授说,我们必须使用递归,而我正在努力避免无限递归。请帮忙

#include <stdio.h>
#include <string.h>

void reversedWord(char input[],int size)
{   int count;
    int count2;
    if(count==0) {
        count2=size;
    }
    count2=count2-1;
    char store;
    store=input[count2];
    input[count2]=input[count];
    input[count]=store;
    count=count+1;
    if(count>size)
    {
        return;
    }
    return reversedWord(input,size);
}

int main()
{
    char input[100];
    printf("Please enter your name: ");
    scanf("%s",input);
    int size=strlen(input);
    reversedWord(input,size);
    printf("\n Your name backwards: %s \n",input);
}
#包括
#包括
void reversedWord(字符输入[],整数大小)
{int计数;
int count2;
如果(计数=0){
count2=大小;
}
count2=count2-1;
焦炭库;
存储=输入[count2];
输入[计数2]=输入[计数];
输入[计数]=存储;
计数=计数+1;
如果(计数>大小)
{
回来
}
返回反向字(输入,大小);
}
int main()
{
字符输入[100];
printf(“请输入您的姓名:”);
扫描频率(“%s”,输入);
int size=strlen(输入);
反向字(输入,大小);
printf(“\n您的姓名向后:%s\n”,输入);
}

由于您在递归函数中使用计数器,因此它们应该是
静态的
,我建议您阅读有关
静态的
在C语言中的作用的文档,如果您不熟悉的话

下面是使用递归的代码,但单词反转算法包含错误。我相信你可以自己想一想来解决这个问题,所以我只想给你一个提示——它把单词颠倒过来,然后又把它颠倒过来

#include<stdio.h>
#include<string.h>

void reversedWord(char input[],int size)
{   
    static int count = 0;
    static int count2;
    if(count==0) {
        count2=size;
    }
    count2=count2-1;
    char store;
    store=input[count2];
    input[count2]=input[count];
    input[count]=store;
    count=count+1;
    if(count>size)
    {
        return;
    }

    reversedWord(input,size);
    return;
}

int main()
{
    char input[100];
    printf("Please enter your name: ");
    scanf("%s",input);
    int size=strlen(input);
    reversedWord(input,size);
    printf("\n Your name backwards: %s \n",input);
}
#包括
#包括
void reversedWord(字符输入[],整数大小)
{   
静态整数计数=0;
静态整数计数2;
如果(计数=0){
count2=大小;
}
count2=count2-1;
焦炭库;
存储=输入[count2];
输入[计数2]=输入[计数];
输入[计数]=存储;
计数=计数+1;
如果(计数>大小)
{
回来
}
反向字(输入,大小);
回来
}
int main()
{
字符输入[100];
printf(“请输入您的姓名:”);
扫描频率(“%s”,输入);
int size=strlen(输入);
反向字(输入,大小);
printf(“\n您的姓名向后:%s\n”,输入);
}

在上述代码中,首先需要初始化变量count和count2

语句int计数;表示您正在声明整数类型的变量计数。但它没有任何价值

对于本例,要使递归工作,需要在每次调用函数时传递3个参数(输入字符串、开始索引、结束索引)

这是修改后的代码,可以让它正常工作

void reversedWord(char input[],int start,int end)
{
    end=end-1;
    char store;
    store=input[end];
    input[end]=input[start];
    input[start]=store;
    start=start+1;
    if(start>=end)
    {
        return;
    }
    return reversedWord(input,start,end);
}

int main()
{
    char input[100];
    printf("Please enter your name: ");
    scanf("%s",input);
    int size=strlen(input);
    reversedWord(input,0,size);
    printf("\n Your name backwards: %s \n",input);
}

我认为,即使将0分配给count和count2,这也不会起作用,因为您是递归调用函数的

因此,每次调用reversedWord(输入,大小)时,值都会再次初始化

> void reversedWord(char input[],int size) {   int count; //initialized
> for every recursive call
>     int count2; //initialized for every recursive call
>     if(count==0) {
>         count2=size;
>     }
>     count2=count2-1;
>     char store;
>     store=input[count2];
>     input[count2]=input[count];
>     input[count]=store;
>     count=count+1;
>     if(count>size)
>     {
>         return;
>     }
>     return reversedWord(input,size); }
更好的解决方案是将这两个变量count和count2声明为静态。 静态整数计数,count2
默认情况下,静态变量被分配为0,它们共享一个公共内存,因此不会为它们分配新空间,新值会反映在同一个变量上(仅初始化一次)

int count;int count2;如果(计数=0)
。。。这里
count
包含垃圾值!您正在从
void
函数返回,而应该在该函数中打印反向单词/字符串。第一次从main调用该函数时,需要在函数内检查
输入[]
是否为
\0
。如果没有,则将数组向前移动1,并递归调用
reversedWord()
函数调试此类错误的一种好方法是打印负责控制更改的变量。尝试打印变量
count
size
,神奇地看到哪里出错了。GL.count和count2是局部变量,您在初始化之前使用了它们。首先打开编译器警告并修复它们。对于gcc和clang编译器,请使用
-Wall-Wextra