使用C中的递归来反转字符数组

时间:2017-09-14 00:42:50

标签: c arrays recursion

这是我的代码,我似乎无法弄清楚如何只使用数组作为参数来创建函数。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

      char strArray[30] = "Print this string backward.";

      puts("");
      stringReverse(strArray);

      return(0);
}


void stringReverse(char strArray[])
{ 

    if(strArray != "\n") {
        stringReverse(&strArray)
        printf("%s", strArray)
    }
}

2 个答案:

答案 0 :(得分:2)

一些观察和批评:

发布的代码不需要math.hstdlib.h头文件。虽然char strArray[30]足够大以容纳输入字符串,但最好在字符串初始值设定项中使用空括号,除非您需要大于初始字符串的特定大小。这不容易出错,而且更容易,因为不需要计算字符数,也不需要记住为null终止符包含空格。您可能希望在调用puts("");之后移动stringReverse(),因为此函数不会打印换行符。对于像这样的事情,使用putchar('\n');似乎更好; putchar()旨在只打印一个字符,因此该工作也是正确的工具。

似乎使用语句if (strArray != "\n") {},目标是检查第一个字符是否为换行符,但是存在一些问题。首先,"\n"是一个字符串,而不是一个字符;接下来,strArray是指向数组strArray[]的第一个字符的指针,而不是第一个字符本身。输入字符串中没有'\n'个字符,因此即使正确编写了这个条件,它也总是正确的,并且此代码将进入无限递归。最后,传递给stringReverse()的参数永远不会改变,因此递归无法结束。为了使递归成功,必须收敛基础案例。

解决方案是将数组的第一个字符与'\0'进行比较。如果第一个字符不是空终止符,则再次调用stringReverse()函数,这次使用值strArray + 1。程序将继续递归调用stringReverse(),直到传入空字符串,此时对stringReverse()的最终调用返回其调用者(之前调用stringReverse()),其中最后一个调用在返回到调用者之前,打印字符串的字符....每个stringReverse()帧都按照与调用它们相反的顺序返回,并且每个帧都打印出一个字符。 string,直到最后到达第一帧,然后打印第一个字符,然后返回main()

请注意,在函数调用中,实际上大多数表达式中,数组会衰减到指向其第一个元素的指针。因此,在stringReverse() strArray中是一个指向char的指针,指向调用者作为参数提供的数组的第一个元素。另请注意,在诸如void stringReverse(char strArray[])的函数声明中,数组类型被调整为适当的指针类型,因此该声明等同于void stringReverse(char *strArray)

#include <stdio.h>

void stringReverse(char strArray[]);

int main(void)
{
    char strArray[] = "Print this string backwards.";

    stringReverse(strArray);
    putchar('\n');

    return 0;
}

void stringReverse(char strArray[])
{
    if (*strArray != '\0') {
        stringReverse(strArray + 1);
        putchar(*strArray);
    }
}

节目输出:

.sdrawkcab gnirts siht tnirP

答案 1 :(得分:0)

首先,您需要返回一个值。

然后,您的算法应该做什么?运行到字符串的最后一个,然后通过一个参数反向返回变量,你只需要在每个循环中更短地传递这个参数。

像这样:

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void stringReverse(char strArray[], int i) {
    if (strArray[0] != NULL)
    if (strArray[0] != '\0') {
        int c = 0;
        char str[30];
        while (c < strlen(strArray)) {
            str[c] = strArray[2 + c -1];
            c++;
        }
        str[c] = '\0';
        stringReverse(str);
    }           
printf("%c", strArray[0]);
}

int main(int argc, char *argv[]) {
    char strArray[30] = "Print this string backward.";
   stringReverse(strArray, 0);
   printf("\n\n");
   system("Pause");
   return(0);
}