C 写一个递归版本的函数reverse(s),它在适当的位置反转字符串s。我似乎找不到错误
这是K和R提出的一个问题。当我试图编译它时,它说是分段错误(核心转储)。然而,我似乎找不到错误C 写一个递归版本的函数reverse(s),它在适当的位置反转字符串s。我似乎找不到错误,c,string,recursion,C,String,Recursion,这是K和R提出的一个问题。当我试图编译它时,它说是分段错误(核心转储)。然而,我似乎找不到错误 #include <stdio.h> #包括 这是你的基本交换 void swap(char s[], int i, int j) { char temp; temp = s[i]; s[i] = s[j]; s[j] = temp; } void reverse(char s[]){ int i, j; if (i == 0)
#include <stdio.h>
#包括
这是你的基本交换
void swap(char s[], int i, int j) {
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
void reverse(char s[]){
int i, j;
if (i == 0)
j = strlen(s)-1;
swap(s, i, j);
j--;
i++;
// Here is where the problem arises. When i don't call the function here the program works perfectly (The limitation being only the first and last char get swapped) otherwise it gives an error saying segmentation fault
if (i < j)
reverse(s);
}
int main () {
int i;
char s[10] = "hello";
reverse(s);
printf("%s", s);
}
void交换(字符s[],整数i,整数j){
焦炭温度;
温度=s[i];
s[i]=s[j];
s[j]=温度;
}
无效反向(字符s[]){
int i,j;
如果(i==0)
j=strlen(s)-1;
互换(s、i、j);
j--;
i++;
//问题就出在这里。当我没有在这里调用函数时,程序工作得很好(限制是只交换第一个和最后一个字符),否则它会给出一个错误,称为分段错误
if(i
首先,当您在reverse
中声明i
时,您没有给它赋值,因此它的值将是随机的。因此,当您在比较中使用i
时,它是未定义的行为。i
和j
在函数反向中未初始化
执行此操作时:
if(i==0)
您将未初始化的变量与零进行比较,因此j
也保持未初始化状态
即使以相反的方式初始化它们,也不会成功,因为reverse
是递归调用的
假设您以相反的方式初始化i
和j
,如下所示:
void reverse (char s[])
{
int i = 0, j = strlen(s)-1;
.....
...
reverse(s);
}
void reverse(char s[], int i, int j)
{
swap( s , i , j);
--j;
i++;
if (i < j)
reverse( s , i , j);
}
由于每次传递i&j进行交换时都会递归调用它,因此它们会再次初始化
到0
和strlen(s)-1
,因此最好在main()
中初始化它们,并按下面给出的方式将它们传递到反向
我想你最好试试这样:
void reverse (char s[])
{
int i = 0, j = strlen(s)-1;
.....
...
reverse(s);
}
void reverse(char s[], int i, int j)
{
swap( s , i , j);
--j;
i++;
if (i < j)
reverse( s , i , j);
}
交换功能
void swap(char *s, int i, int j)
{
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
printf("swap %s\n",s);
}
void reverse(char *s,int j,int i)
int main ()
{
int i=0;
char s[10] = "hello";
printf("%s\n",s);
reverse(s,(strlen(s)-1),i);
printf("%s\n", s);
return 0;
}
倒车功能
void swap(char *s, int i, int j)
{
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
printf("swap %s\n",s);
}
void reverse(char *s,int j,int i)
int main ()
{
int i=0;
char s[10] = "hello";
printf("%s\n",s);
reverse(s,(strlen(s)-1),i);
printf("%s\n", s);
return 0;
}
这里我传递的是地址,所以s和j以及我必须从main中获取,因为我们不能初始化这个反向函数中的变量,因为它可能会导致终止条件出现问题。你也犯了同样的错误
输出
hello
0 4
swap oellh
1 3
swap olleh
2 2
olleh
`int i,j;如果(i==0)`i是不确定的*s是必要的,因为我们传递地址,不,那不是必要的<代码>反向(s,--j,++i)代码>这不好,或者我应该说几乎没有定义。@这是怎么定义的?请告诉我?因为调用中没有预定义的序列,预增量可能发生在函数调用之前,所以它肯定会有副作用。谷歌吧!!您很可能会在SO本身上得到答案。@这就是为什么我使用pre…我想在它进行递归调用以反转Hanks之前对其进行预增量,但刚才我发布了相同的问题,以便澄清,如果您注意到我未初始化j,我是故意这么做的。这是因为我认为当你声明一个整数而不初始化它时,默认值为0。(我可能错了,但请检查这段代码)#include main(){int I;printf(“%d”,I);返回0;}您所说的是正确的,但这段代码的输出让我困惑。#丢失了一个不正确,这不正确。只有使用特定存储类定义的变量的值为0,如
extern
和static
。使用-Wall选项编译。我想知道你是怎么得到0的,它应该打印垃圾。是外人干的。在外面初始化它解决了问题谢谢大家!!:)@PHIfounder,但我确实在编译时未初始化就得到了0。@如果\u丢失了\u,那么您的编译器或系统一定有问题。@u丢失了\u未指定行为的行为是它未指定。任何事情都有可能发生,这完全是不可预测的。@U失去了一个你没有告诉它是否对你有用的东西:)永远记得给我们反馈,如果可能的话,接受你满意的答案。。。。。。这有助于使帖子变得更好、更有用:)