使用递归反转数组内容(C语言)

时间:2014-03-20 11:38:46

标签: c arrays recursion reverse

函数reverseAr()接受两个参数,一个char(ar [])数组和数组(n)的大小,然后反转数组的内容(不使用另一个数组)。然后,该函数将通过参数ar。

将结果返回给调用函数

我的代码似乎无法运行,我认为我错误地在函数之间传递了值,但我无法弄清楚在哪里。

以下是代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <string.h> 
#include <math.h> 

void reverseAr(char ar[], int n);

int main()
{
    char str[128];
    int len;

    printf("\nEnter an array of characters: ");
    gets(str);
    len = strlen(str);
    printf("The reversed array of characters is = %s\n", reverseAr(str, len));

    return 0;
}

void reverseAr(char ar[], int n)
{
    char temp = ar[0];
    ar[0] = ar[n - 1];
    ar[n - 1] = temp;
    if (n > 1) 
    {
        reverseAr(++ar, n - 2);
    }
}

预期产出:

Enter an array of characters: abcde
The reversed array of characters is = edcba

4 个答案:

答案 0 :(得分:5)

此:

char str;

gets(str);

是未定义的行为,应该给出您忽略的编译器警告(甚至错误)。

gets()要求指针指向一个字符数组,你要给它单个字符的值,这是不一样的什么都没有。它会将该字符的未定义值解释为地址,并将输入文本存储在那里。

应该是:

int main()
{
  char line[128];

  printf("\nEnter an array of characters: ");
  if(fgets(line, sizeof line, stdin) != NULL)
  {
    const size_t len = strlen(line);
    printf("The reversed array of characters is = %s\n", reverseAr(line, len));
  }
  return 0;    
}

strlen()的返回类型不是int,它是size_t所以您应该使用它,并相应地更改reverseAr()

答案 1 :(得分:3)

这是用于反转字符串

的工作代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int reverseAr(char ar[], int , int);

int main()
{
    char str[128];
    int len;

    printf("\nEnter an array of characters: ");

    if(fgets(str, sizeof(str), stdin) != NULL)
    {
        len = strlen(str);
        reverseAr(str, 0, len-1);
    }
    printf("The reversed array of characters is = %s\n", str );
    system("pause");
    return 0;
}

int reverseAr(char ar[], int first, int last)
{
    char temp = ar[first];
    ar[first] = ar[last];
    ar[last] = temp;

    if (first < last) 
    {
        reverseAr(ar, ++first, --last);
    }
    else
    {
        return 0;
    }
}

答案 2 :(得分:2)

我认为问题在于如何打印结果:

void reverseAr(char ar[], int n);
printf("The reversed array of characters is = %s\n", reverseAr(str, len));

printf需要一个字符串,你传递的是无效的......

您应该将其替换为:

reverseAr(str, len-1);
printf("The reversed array of characters is = %s\n", str);

您会注意到我正在将len的len-1传递给reverseAr,这是因为您希望单独留下字符串中的最后一个字符('\ 0'),并且只切换其余的人物。最终你想要修复reverseAr函数:

void reverseAr(char ar[], int i, int n)
{
    char temp = ar[i];
    ar[i] = ar[n];
    ar[n] = t;

    if (i < n) 
    {
        reverseAr(ar, i++, n - 1);
    }
}

并以不同的方式称呼它:reverseAr(str,0,len-1);

答案 3 :(得分:0)

你可以在reverseAr函数中使用指针而不是使用数组名(因为++ ar不是有效的),下面的一些东西应该可以工作 -

/ *在Main * /

int main() {

    char str[128];
    int len;

    printf("\nEnter an array of characters: ");
    gets(str);    /* use fgets instead */

    len = strlen(str) - 1;  /* length is one less than the strlen */

    printf("The reversed array of characters is = %s\n", reverseAr(str, len));

    return 0;

}

void reverseAr(char * ar,int n) {

    /* Base case */
    if (ar > (ar + n))
    {
        return;
    }
    char temp = *ar;
    *ar = *(ar + n);
    *(ar + n) = temp;
    reverseAr(ar + 1, n - 1);

}