C语言---递归反向输出任意长度的字符串

简介: (该字符串可以包含空格和回车!) 【题目要求】 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。 例如输入字符串:ABCD,输出字符串:DCBA。【题目分析】 应用递归的思想有时可以很轻松地解决一些看似不太容易实现的功能。

(该字符串可以包含空格和回车!)
【题目要求】
编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。
例如输入字符串:ABCD,输出字符串:DCBA。

【题目分析】
应用递归的思想有时可以很轻松地解决一些看似不太容易实现的功能。
本题就是利用递归方法解决这类问题的一个代表。要将一个字符串反向地输出,一般采用的方法是将该字符串存放到一个数组中,然后将数组元素反向地输出即可。
这样需要一个存储空间,而且字符串的长度无法自由掌握,因为数组是一种静态数据结构。如果选用动态生成的顺序表或者链表来存放字符串,那么实现起来会比较麻烦,特别是如果把字符串存放到单向链表中,反向输出是非常困难的。
如何才能输入任意长度的字符串,然后将其反向输出呢?
可以通过一个递归的方法巧妙地实现这个功能。
算法描述如下:

print(){
    输入字符串的一个字符a:
    if(a!='#') print();
    if(a!='#') then 输出该字符a;
}

在该算法中,字符串的结束标志为#,并且#不作为字符串中的内容输出。首先输入字符串的一个字符,存放到变量a中:然后递归地调用函数print(),重复上述操作,知道输入字符串结束标志#为止;然后输出字符串中的字符。

假设从屏幕上输入字符串ABC,并且以#作为结束标志,函数print()的递归过程如下图所示:

如上图所示,从屏幕上输入字符串ABC,并以#作为结束标志,然后反向输出该字符串,整个流程沿着图中箭头方向执行。因此输出的字符串与输入的字符串方向相反。

整个实现的C源代码:

#include <stdio.h>
#include <stdlib.h>
print(){
    char a ;
    scanf("%c",&a);
    if(a!='#'){
        print();
    }
    if(a!='#'){
        printf("%c",a);
    }
}
int main()
{
    printf("Please input a string ending for '#' :\n");
    print();
    return 0;
}

输出结果:

下面的是没实现递归的Java实现这个功能的完整代码:
而且貌似java也不能从控制端读入单个字符。。。。
所以并不能实现这个c能实现的递归功能。

package cn.hncu;

import java.util.Scanner;

public class String1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strs = "";
        while(true){
            int k=-1;
            String str = sc.nextLine();
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)=='#'){
                    k=i;
                }
            }
            if(k==-1){
                strs = strs+str+"\r\n";
            }else{
                for(int i=0;i<k;i++){
                    strs = strs+str.charAt(i);
                }
            }
            if(k!=-1){
                break;
            }
        }

        for(int i=strs.length()-1;i>=0;i--){
            if(strs.charAt(i)=='\n'){
                System.out.println();
                i--;
                continue;
            }
            System.out.print(strs.charAt(i));
        }
    }
}
目录
相关文章
|
25天前
|
存储 编译器 C语言
爱上C语言:函数递归,青蛙跳台阶图文详解
爱上C语言:函数递归,青蛙跳台阶图文详解
|
11天前
|
C语言 C++
C语言利用ASCII码表统计字符串每个字符出现的次数
C语言利用ASCII码表统计字符串每个字符出现的次数
13 0
|
11天前
|
机器学习/深度学习 C语言
函数递归深入解析(C语言)
函数递归深入解析(C语言)
|
13天前
|
存储 C语言
C语言中字符串的引用与数组元素操作
C语言中字符串的引用与数组元素操作
16 0
|
13天前
|
安全 C语言
指针与字符串:C语言中的深入探索
指针与字符串:C语言中的深入探索
15 0
|
14天前
|
C语言 索引
c语言的函数与递归
c语言的函数与递归
14 1
|
25天前
|
搜索推荐 C语言 C++
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
|
25天前
|
存储 C语言
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
|
11天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
5天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧