Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 写一个递归版本的函数reverse(s),它在适当的位置反转字符串s。我似乎找不到错误_C_String_Recursion - Fatal编程技术网

C 写一个递归版本的函数reverse(s),它在适当的位置反转字符串s。我似乎找不到错误

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)

这是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) 
        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失去了一个你没有告诉它是否对你有用的东西:)永远记得给我们反馈,如果可能的话,接受你满意的答案。。。。。。这有助于使帖子变得更好、更有用:)