使用C中的递归逆转字符阵列



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

#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)
    }
}

一些观察和批评:

发布的代码不需要math.hstdlib.h标头文件。尽管char strArray[30]足够大以容纳输入字符串,但最好在字符串初始化器中使用空括号,除非您需要比初始字符串大的特定大小。这是不容易出错的,而且更容易,因为没有必要计算字符,也不需要记住为空末端包含空格。您可能希望将puts("");移至stringReverse()调用后,因为此功能不会打印新线字符。通常最好将putchar('n');用于类似的东西。putchar()旨在仅打印一个字符,因此适合作业的工具也是如此。

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

解决方案是将数组的第一个字符与''进行比较。如果第一个字符不是空末端,则stringReverse()函数再次调用,这次使用值strArray + 1。该程序将继续递归地调用stringReverse(),直到传递一个空字符串为止,此时,stringReverse()的最终呼叫返回到其呼叫者(上一个呼叫stringReverse()),该字符串的最后一个字符已打印,然后返回其呼叫者,....以相反的顺序返回到stringReverse()帧中的每个框架,这些框架中的每一个都打印出字符串的字符,直到最终达到第一个帧,然后打印第一个字符,在返回main()

之前

请注意,在函数调用中,实际上大多数表达式,阵列会腐烂到指向其第一元素的指针。因此,在stringReverse()中,strArraychar的指针,指向呼叫者作为参数提供的数组的第一个元素。另请注意,在函数声明中,例如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 != '') {
        stringReverse(strArray + 1);
        putchar(*strArray);
    }
}

程序输出:

.sdrawkcab gnirts siht tnirP

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

那么,您的算法应该做什么?运行直到字符串的决赛,然后仅用一个参数返回变量,然后您只需要将此参数短。

这样:

#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] != '') {
        int c = 0;
        char str[30];
        while (c < strlen(strArray)) {
            str[c] = strArray[2 + c -1];
            c++;
        }
        str[c] = '';
        stringReverse(str);
    }           
printf("%c", strArray[0]);
}
int main(int argc, char *argv[]) {
    char strArray[30] = "Print this string backward.";
   stringReverse(strArray, 0);
   printf("nn");
   system("Pause");
   return(0);
}

最新更新