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);
}
4

3 回答 3

1

首先,当您i在内部声明时,reverse您不会为其分配值,因此它的值将是随机的。因此,当您i在比较中使用它时,它是未定义的行为。

于 2013-07-21T10:10:55.220 回答
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)

这里我传递地址所以s 和 j 并且 i 必须从 main 中获取,因为我们不能在这个反向函数中初始化变量,因为它可能会导致终止条件出现问题。你犯了同样的错误。

{
    printf("%d\t%d\n",i,j);
    if(i<j)//`base condition`
{
    swap(s, i, j);
    reverse(s,--j,++i);
}
}

--j 将在 j 中递减, ++i 将在 i 中递增。这里的 preincrement 和 predecrement 是关键

主功能

    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;
}

输出

hello
0   4
swap oellh
1   3
swap olleh
2   2
olleh
于 2013-07-21T12:10:35.723 回答
0

i并且j在函数反向中未初始化。

当你这样做时:

if (i==0)

您正在将未初始化的变量与零进行比较,因此j也保持未初始化。

即使您反向初始化它们也不会成功,因为reverse它是递归调用的。

假设您像这样初始化ij反向:

void reverse (char s[])
{
 int i = 0, j = strlen(s)-1;
   .....
   ...
 reverse(s);
}

由于每次通过 i 和 j 进行交换时都会递归调用它们,因此它们会再次初始化为0and strlen(s)-1,因此最好将它们初始化main()并传递给反向,如下面给出的方式。

我认为你最好尝试这样的事情:

void reverse(char s[], int i, int j)
{
  swap( s , i , j);
  --j;
  i++;
  if (i < j)
    reverse( s , i , j);
}

然后在做这样的事情main()

  char s[] = "hello";
  int i = 0 , j = strlen(s)-1;
  reverse( s , i , j);
  printf("%s" , s);
于 2013-07-21T10:15:01.687 回答