我的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
。