C语言---递归反向输出任意长度的字符串
(该字符串可以包含空格和回车!)
【题目要求】
编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。
例如输入字符串: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语言---递归反向输出任意长度的字符串的更多相关文章
- Python学习(三) 输出任意格式的字符串以及字符串的切片
在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...
- Java工具类_随机生成任意长度的字符串【密码、验证码】
import java.util.Random; public class PasswordCreate { /** * 获得密码 * @param len 密码长度 * @return */ pub ...
- 使用printf输出各种格式的字符串( 转载)
1. 原样输出字符串: printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐: printf("%Ns" ...
- 任意长度的正小数的加法(YT新人之巅峰大决战05)
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...
- [c++]大数运算1---利用C++ string实现任意长度正小数、整数之间的加减法
一.概述 本文属于大大维原创,未经笔者本人允许,严禁转载!!! C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-429496 ...
- [c++]大数运算---利用C++ string实现任意长度正小数、整数之间的加减法
本文为大大维原创,最早于博客园发表,转载请注明出处!!! 一.概述 C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-4294 ...
- 随机生成指定长度字符字符串(C语言实现)
相关函数 srand(), rand()头文件#include<stdlib.h> 定义函数 int rand(void) 函数说明 rand()会返回一随机数值,范围在0至RAND_MA ...
- 串口应用:遵循uart协议发送N位数据(状态优化为3个,适用任意长度的输入数据,取寄存器中的一段(用变量作为边界))
上一节中成功实现了发送多个字节的数据.把需要发送的数据分成多段遵循uart协议的数据依次发送.上一节是使用状态机实现的,每发一次设定为一个状态,所以需要发送的数据越多,状态的个数越多,代码越长,因而冗 ...
- 生成任意长度的随机数 JS
1.Math.random().toString(36).substr(2); 结果:ywv6cnpkliahj4tep0 2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
随机推荐
- qt 程序启动参数 -qws
运行嵌入式程序 在嵌入式QT版本中,程序需要服务器或自己作为服务器程序.服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象.或者使用-qws命 ...
- 第三篇:R语言数据可视化之条形图
条形图简介 数据可视化中,最常用的图非条形图莫属,它主要用来展示不同分类(横轴)下某个数值型变量(纵轴)的取值.其中有两点要重点注意: 1. 条形图横轴上的数据是离散而非连续的.比如想展示两商品的价格 ...
- android中的Handler和Runnable
最近在做一个项目,在网络请求时考虑用Handler进行处理,然后就研究了一下Handler和Runnable 首先在看一下java中的Runnable The Runnable interface s ...
- 【开源java游戏框架libgdx专题】-12-开发工具-图片合成
TexturePackerGui工具: 1.工具使用: 首先看到texturepacker的界面 界面介绍: New pack:创建项目按钮,单击后输入文件名称,创建文件. Input directo ...
- MD5加密相关
demo效果
- asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解
从客户端(ftbContent="<P><A href="http://l...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验 ...
- 抓取锁的sql语句-第二次修改
CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句 CUR_LOCK SYS ...
- iOS关于sqlite3操作
原文:http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html iPhone中支持通过sqlite3来访问iPhone本地 ...
- 通过Unity依赖注入
前言 Unity容器的思想起始于我在为Web Client Sofitware Factory项目工作的时候,微软的patterns&practices团队已经使用依赖注入的概念好几年了在那时 ...
- [转载]__type_traits
在STL中为了提供通用的操作而又不损失效率,我们用到了一种特殊的技巧,叫traits编程技巧.具体的来说,traits就是 通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性, ...