开发者社区> 谙忆> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C语言---字符串讲解(层层递进,详细易懂)
C语言---字符串讲解(层层递进,详细易懂)
12 0
C语言之字符串与字符数组的区别
​ 1.字符串的定义: (1)单个字符: char ch='i';//单个字符的定义 (2)一维字符串数组: char arr[]="love";(这种方法定义的一维字符串数组必须赋值) char arr[4];(想内存申请创建可以存储3个字符的数组空间) char arr[5]=”love”;(开辟5个字节的空间存放字符love,最后一个字节存放'\0'字符) char arr[5]={'l','o',v','e'};(开辟5个字节的空间存放字符love,最后一个字节存放'\0'字符) 2.字符串长度 3.字符串和字符数组的区别: 由于C语言中没有string关键字,所以不能定义字符串
18 0
C语言进阶——字符串&&内存函数(下)
这个函数实现起来就比较复杂了,需要用到多个指针,不断记录位置、移动位置、刷新位置,当然我们这里模拟实现的是效率比较低的算法,如果想要追求时间,可以参考参考KMP算法, 提高寻找效率。
19 0
C语言进阶——字符串&&内存函数(上)
这是牛客网上的一道简单题:判断输入字符是否为字母,一般的解决方法是通过ASCII码判断,不过这样做的话判断表达式较长,此时我们可以利用C语言中的库函数isalpha(判断是否为字母) 来完成这个题目,不仅代码量少,而且通俗易懂。要实现这种效果,就需要学习C语言中的各种库函数,而本文会列出大多数字符串函数和内存函数的使用及其实现,如果你想学习C语言库函数或对字符串、内存有好奇之心,不妨仔细来看看吧!
25 0
C语言题解——倒置字符串(剑指Offer 第58题)
C语言题解——倒置字符串(剑指Offer 第58题)
11 0
C语言实现字符串转整型
1、输入中只包含正负号和数字。 2、正负号只只出现在首位。
31 0
C语言字符串、宏定义及主函数介绍
C语言字符串、宏定义及主函数介绍
36 0
C语言字符串与字符串函数
C语言字符串与字符串函数
12 0
C语言从入门到放弃——字符串和内存操作函数
C语言从入门到放弃——字符串和内存操作函数
25 0
C语言从入门到精通——字符串和转义字符
C语言从入门到精通——字符串和转义字符
24 0
+关注
谙忆
GitHub: https://github.com/chenhaoxiang
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载