字符串逆序的几种写法

提示:将字符串逆序与将其逆序打印出来是两码事,逆序是将内容倒着改变了,逆序打印虽然打印结果也是倒着的,不过储存字符串的数组内容并没有改变。

一、非递归写法

1. 将一个给定的字符串abcdef逆序

#include <stdio.h>
int main()
{char arr[] = "abcdef";int sz = sizeof(arr) / sizeof(arr[0]); //求的是数组包含的元素个数,'\0'也包括在内int left = 0;int right = sz - 2;   //减2是因为求得的sz包含了'\0'这个元素。while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s", arr);return 0;
}

打印结果为fedcba。
逆序思路为:将一字符串最左端与最右端的字符交换,交换过后,通过数组下标将左边第二个字符与右边第二个字符交换,依次类推,知道数组下标通过left++与right–,使得left>=right。

2. 自己输入一串字符串,将其逆序

#include <stdio.h>
#include <string.h>
int main()
{char arr[101] = { 0 };     //要给字符数组一定的内存大小,如果写成char arr[] = { 0 };,当在给数组输入的时候就会造成越界访问。scanf("%s", arr);int sz = strlen(arr);    //在给定字符数组的大小为101的情况下,只能用strlen求输入字符串长度。//用sizeof(arr)/sizeof(arr[0])求出来的是数组大小,为101。int left = 0;int right = sz - 1;while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s", arr);return 0;
}

随便输入一串字符,例如:12345gf,打印结果为fg54321。
注意:对于自己给数组输入数据,再将其逆序这种情况下,在定义数组时,要给字符数组一定的内存大小。如果写成char arr[] = { 0 };,说明这个数组的容量只有一个字节,只能输入一个字符,当在给数组输入的时候就会造成越界访问。

3. 将逆序封装成函数

#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{int left = 0;int right = strlen(arr) - 1;      //封装成函数只能用库函数求字符串长度,不能用sizeof(arr)/sizeof(arr[0])-1这种方式。//因为数组形参就是个地址。sizeof(arr)与sizeof(arr[0])的大小都是四个字节或者八个字节。while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
int main()
{char arr[] = "abcdef";reverse(arr);printf("%s", arr);return 0;
}

与sizeof 两者用来求字符串长度时的场合区别。
这里值得注意的是,在自定义函数中求字符串长度时,不要用sizeof(arr)/sizeof(arr[0])-1这种方式。直接使用库函数 strlen。因为数组在传参的时候,传过去的是数组首元素的地址,也就是说形参虽说写的是数组的形式char arr[],但是形参其实是个指针变量char*。对于指针变量来说,其大小根据编译器环境,都是四个字节或者都是八个字节。sizeof运算符就是获取数据类型和表达式的尺寸的(单位:字节)。sizeof(arr)与sizeof(arr[0])的大小都是四个字节或者八个字节。所以sizeof(arr)/sizeof(arr[0])-1=4/4-1=0,或者8/8-1=0。

二、递归写法

1. 方法一

#include <stdio.h>
#include <string.h>
void reverse(char str[])  //用数组接收实参,也可用指针接收实参,如void reverse(char* str)
{char tmp = *str;int len = strlen(str);*str = *(str + len - 1);*(str + len - 1) = '\0';if (strlen(str + 1) >= 2)  //首尾交换后,剩下的元素构成的数组,长度要大于1,才逆序,只剩下一个元素,表明其是最中间的元素,放在原位就好。{reverse(str + 1);}*(str + len - 1) = tmp;
}
int main()
{char arr[101] = { 0 };scanf("%s", arr);reverse(arr);printf("%s\n", arr);return 0;
}

思路:假设一个数组有 n 个元素。
交换str[0]与 str[n-1],再逆序 str[1] 与 str[n-2]
交换 str[1] 与 str[n-2],再逆序 str[2] 与 str[n-3]。依次类推
······
操作步骤:1.先将第一个字符,即 str[0] 位置上的字符放在一个临时变量中。2.将最后一个元素交换到 str[0] 的位置去。3.将字符串中的’\0’放到arr[n-1] 的位置上去。4.此时从 str[1] 到 str[n-2] 的角度上看,是一个新的字符串,将 str[1] 与 str[n-2] 交换。5.将先前放在临时变量中的第一个字符赋给 arr[n-1] 的位置上去。

注意:在第三步并没有将放在临时变量中的第一个字符直接往 str[n-1]上放,而是经过第四步,将str[1] 与 str[n-2] 交换后,才将之前未交换完的第一个字符放到 str[n-1] 上去。原因:如果直接将 str[0] 与 str[n-1] 上的元素通过一个临时变量交换了。那么对于即将要交换的 str[1] 与 str[n-2] 来说,他们与’\0’之间隔了一个放在str[n-1]上的第一个字符,str[1] 与 str[n-2] 也就无法通过首尾字符直接交换的方式进行交换了 。


逆序a b c d e f 等于交换 a与f ,再逆序b c d e
逆序b c d e 等于交换b与e,再逆序c d。依次类推。

2. 方法二

#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{if (left < right){char tmp = str[left];str[left] = str[right];str[right] = tmp;reverse(str, left + 1, right - 1);}}
int main()
{char arr[101] = { 0 };scanf("%s", arr);int left = 0;int right = strlen(arr) - 1;reverse(arr, left, right);printf("%s\n", arr);return 0;
}

方法二比方法一传的参数要多,直接将首尾字符通过第三个临时变量进行交换就行。

字符串逆序的几种写法相关推荐

  1. 字符串逆序的几种方法

    普通逆序 char* Reverse(char* s) {//将q指向字符串最后一个字符char* q = s ;while( *q++ ) ;q -= 2 ; //分配空间,存储逆序后的字符串.ch ...

  2. python把字符串逆序输出_python实现对指定输入的字符串逆序输出的6种方法

    python实现对指定输入的字符串逆序输出的6种方法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python实现对指定输入的字符串逆序输出的6种方法.txt  ...

  3. python逆序输出字符串_python实现对指定输入的字符串逆序输出的6种方法

    编写一个Python程序,提示用户输入一个字符串,程按照你的要分享编写的逆序显示字符串的Python3程序如下 s = input("请输入一个字符串:")print(s[::-1 ...

  4. python字符串逆序_python之字符串逆序

    python之字符串逆序 1.贴题 题目来自PythonTip 给你一个字符串 a, 请你输出逆序之后的a. 例如:a='xydz' 则输出:zdyx 2.说明 思路基本分为两种, 一是编写循环,每次 ...

  5. 字符串面试题(一)字符串逆序

    字符串逆序可以说是最经常考的题目.这是一道入门级的题目,相信80%的程序员经历过这道题.给定一个字符串s,将s中的字符顺序颠倒过来,比如s="abcd",逆序后变成s=" ...

  6. 练习7-11 字符串逆序 (15分)

    练习7-11 字符串逆序 (15分) 输入一个字符串,对该字符串进行逆序,输出逆序后的字符串. 输入格式: 输入在一行中给出一个不超过80个字符长度的.以回车结束的非空字符串. 输出格式: 在一行中输 ...

  7. c语言对字符串逆序,【C语言】 字符串逆序

    [C语言] 字符串逆序 字符串逆序有多种办法,下面我们分方法而论: // 非递归实现字符串反转: char *reverse(char *str) { if( !str ) { return NULL ...

  8. Unicode 字符串逆序

    字符串的逆序是个非常简单的算法,可以直接使用一层循环搞定,或者下面一句代码. str = new string(str.Reverse().ToArray()); 但是对于 Unicode 字符串来说 ...

  9. C语言/关于字符串逆序存储

    关于字符串逆序存储问题,本文主要介绍了两种方法:1.递归 2.非递归 递归: 先利用my_strlen()函数求出所求字符串长度,字符串长度保存在变量len中(不含字符串'\0')(也可以直接使用库函 ...

最新文章

  1. Java多线程开发之------多线程等待
  2. 开发日记-20190328 关键词 利用eolinker一键快速生成API接口文档
  3. notepad 如何运行php,notepad怎么运行c
  4. hibernate.cfg.xml 配置(摘录)
  5. Tensorflow 2 Auto-Encoder
  6. 白岩松谈“房闹“现象
  7. pythonjs设置_在节点js中设置env变量并在python脚本中使用
  8. 字符串匹配-kmp算法
  9. 编译OpenCV:precomp.hpp:60:37: fatal error: dynlink_nvcuvid.h
  10. oracle分组取第N条,ROW_NUMBER() OVER的用法
  11. 室内声场计算机模拟的声线跟踪法和虚声源法,计算机声场模拟软件ODEON及其应用lowbar;彭庆 - 范文中心...
  12. Google Earth Engine(GEE)计算雷达植被指数RVI
  13. HTML5期末大作业 漫画网站设计——动漫海贼王(10页) 动漫网页设计制作 简单静态HTML网页作品 动漫网页作业成品 学生动漫网站模板
  14. c/c++ 去掉空格函数
  15. Java文件操作、IO流
  16. 面试要点之——23种设计模式及其应用场景
  17. spring的task和quartz的区别
  18. JavaScript有关this指向问题,如何修改this指向
  19. 04【结构面】 面试之结构面,什么是结构面?结构面的准备,常见问题分析?
  20. 计算机专业难不难,计算机专业考研难不难

热门文章

  1. MongoDB学习(三)-- 增删改
  2. java自动化分页_Python+Selenium自动化实现分页(pagination)处理
  3. 简学Python第二章__巧学数据结构文件操作
  4. 9 Palindrome Number
  5. 推荐一款非Win7下专用的“任务栏图标收纳”工具——TrayApp(转自:http://www.ibobosky.com/my-quick-start-tool-trayapp.htm)...
  6. IP访问控制列表配置
  7. sourcetree交互式变基
  8. springboot+websocket+sockjs进行消息推送【基于STOMP协议】
  9. 智慧树python数据分析与数据可视化章节答案_知到智慧树_Python数据分析与数据可视化_章节答案...
  10. C语言 goto语句