这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下

编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。比如:char arr[]="abcdef" 输出:fedcba

思路:(非递归)arr里存放的字符:

a b c d e f \0

输出后的arr里存放的字符:

f e d c b a \0

我们需要将字符a和字符f调换,字符b和字符e调换,字符c和字符d调换,怎么调换呢?这就需要指针

1.首先,我们写主函数

int main()
{  char arr[] = "abcdef";  reverse_string(arr);  printf("%s\n", arr);  //%s是打印字符串格式return 0;
}

有人问,everse_string(arr)调用函数时形参不是要用指针,实参那里应该是个地址啊,reverse_string(arr)中arr应该是&arr,但其实arr本身就是给地址,数组名arr就是arr首元素的地址,就是字符a

2.主函数写完后,我们写函数reverse_string

void reverse_string(char* str)
{  int left = 0; int right = my_strlen(str) - 1; while (left < right)  {   char temp = str[left]; str[left] = str[right];   str[right] = temp;   left++;   right--;  } //若left=right,不用交换字符
} 

为什么用void类型而不用int类型?因为这里传址改变的是数组arr里的元素顺序,不需要改变它的值,不需要返回数组,所以用void

这里left和right定义的是数组下标,left初始化为0,代表的是arr[0],即字符a,而right,我们想要让它定义字符f,也就是arr最后一个字符的下标,怎么做呢?我们可以先求字符串的长度,然后减1就是arr的最后一个字符位置,但是题目不能使用库函数中的字符串操作函数,所以我们要在函数reverse_string里嵌套另一个函数my_strlen,用来实现求字符串长度

3.编写函数my_strlen

int my_strlen(char* str) //求字符串长度
{  int count = 0;while(*str != '\0')  //这里不能用if,因为if是选择语句,不能实现循环{   count++;   str++;  //指向下一指针}  return count;
}​//遇到\0停止循环

最终代码如下:

#include<stdio.h>
int my_strlen(char* str) //求字符串长度
{  int count = 0;while(*str != '\0')  //这里不能用if,因为if是选择语句,不能实现循环{   count++;   str++;  //指向下一指针}  return count;
}void reverse_string(char* str)
{  int left = 0; int right = my_strlen(str) - 1; while (left < right)  {   char temp = str[left]; str[left] = str[right];   str[right] = temp;   left++;   right--;  } //若left=right,不用交换字符
} int main()
{  char arr[] = "abcdef";  reverse_string(arr);  printf("%s\n", arr);    //%s是打印字符串格式return 0;
}

输出结果:

递归思路:

a b c d e f \0

abcdef的逆序可以看成a和f交换,加上bcde的逆序,然后bcde的逆序可以看成b和e交换加上cd的逆序,cd的逆序可以看成c和d交换

①将字符a取出来

  b c d e f \0
a

②将字符f交换到a的位置

f b c d e \0
a

③在f的位置放'\0'

f b c d e \0 \0
a

为什么要放斜杠0?若将bcde传给函数reverse_string,完成不了逆序的实现,因为如果f所在的位置不是斜杠0,函数会判别后面还有字符,实现不了逆序,若放斜杠0,此时函数会将bcde看成字符串,实现逆序的功能

④将中间的bcde传给函数,实现逆序

⑤将字符a放在最开始字符f的位置

f b c d e a

\0

通过上述步骤,我们可以发现④是个递归的过程

reverse_string函数如下

void reverse_string(char* str)
{  char temp = *str;  // 对应步骤①  可写成char temp=str[0];  代表字符aint len = my_strlen(str);  //求字符串长度* str = *(str + len - 1 );  //对应步骤② 可写成str[0]=str[len-1]*(str + len - 1 )= '\0';//对应步骤③ 可写成str[len-1]='\0'//末尾置'\0'方便计算字符串长度以及置换其他位置  if (my_strlen(str+1)>=2)  {   reverse_string(str + 1);  //对应步骤④ }
//若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
//当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序*(str + len - 1 )= temp;//对应步骤⑤ 可写成str[len-1]=temp   将末尾置换
}

最终代码:

#include<stdio.h>
int my_strlen(char* str) //求字符串长度
{int count = 0;while (*str != '\0')  //这里不能用if,因为if是选择语句,不能实现循环{count++;str++;  //指向下一指针}return count;
}void reverse_string(char* str)
{char temp = *str;  // 对应步骤①  可写成char temp=str[0];  代表字符aint len = my_strlen(str);  //求字符串长度*str = *(str+len-1);//对应步骤② 可写成str[0]=str[len-1]*(str+len-1) = '\0';//对应步骤③ 可写成str[len-1]='\0'//末尾置'\0'方便计算字符串长度以及置换其他位置  if (my_strlen(str + 1) >= 2){reverse_string(str + 1);  //对应步骤④ }//若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环//当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序*(str+len-1) = temp;//对应步骤⑤ 可写成str[len-1]=temp   将末尾置换
}int main()
{char arr[] = "abcdef";reverse_string(arr);printf("%s\n", arr);    //%s是打印字符串格式return 0;
}

输出结果:

使用C语言实现字符串逆序操作相关推荐

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

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

  2. C语言实现——字符串逆序

    目录 前言 如何实现 代码实现 1.设立一个数组存放输入的字符串 2.将输入的字符串整体逆序 2.1 计算字符串长度 2.2 使用函数来实现倒置 2.3 实现函数reverse 3.将其中每个单词再进 ...

  3. c语言指针字符串逆序存放,C语言指针实现字符串的反转

    题目要求: 编写程序:从键盘任意输入一个字符串,输出该字符串. 然后,将该字符串逆序存放后再输出,要求用字符指针完成. 代码: //解法一 #include #include int main() { ...

  4. c语言实现单链表逆序算法,C语言解字符串逆序和单向链表逆序问题的代码示例...

    字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { ...

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

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

  6. C语言实现字符串逆序、倒置字符串(字符串逆序问题的升级)

    一.字符串逆序 问题描述: 输入一个字符串str,将其内容颠倒过来,并输出. 数据范围0<len(str)<10000 输入描述: 输入一个字符串,可以有空格 输出描述: 输出逆序的字符串 ...

  7. c++语言将字符串逆序输出,C++实现字符串删除字符后逆序输出

    本文实例为大家分享了C++实现字符串删除字符后逆序输出的具体代码,供大家参考,具体内容如下 输入若干个字符串,和一个英文字符ch. 要求删除每个字符串中的字符ch(区分大小写),得到新的字符串,然后将 ...

  8. 【c语言】字符串逆序

    输入一个字符串,长度在100以内,按相反次序输出其中的所有字符. 样例输入 tsinghua 样例输出 auhgnist #include <stdio.h> #include <s ...

  9. C语言简单递归实现字符串逆序输出

    题目内容的 "注意" 已经侧面规定了要用递归来实现: 输入是一个可能含有空格的串说明要用gets来读入字符串,如果利用scanf的话是无法读入一段含有空格的串. 下面先上一般方法: ...

最新文章

  1. 模式实例之——外观实例
  2. 如何解决Keil5打红叉的问题
  3. 手脱FSG 2.0 - bart/xt
  4. Java定时多线程任务实现(TimerTask)
  5. 2020 年最全 Python 面试题汇总 (四)
  6. 一个html代码太多,如何为一个部分呈现多次的一个html代码
  7. 学习日记16、easyui editor datagrid 动态绑定url
  8. XML数据结构 SAX 解析
  9. hive-使用开窗函数实现百分比、topN、前百分比
  10. 灰尘对服务器影响吗,灰尘可谓是数据中心机房的死敌
  11. 帆软报表参数传给网络报表_在报表中给session赋值实现报表间参数共享
  12. 5 steps to autotools GNU diction
  13. CC00072.pbpositions——|HadoopPB级数仓.V01|——|PB数仓.v01|Griffin数据质量监控工具|概述|
  14. java 正整数类型_Java 整数类型
  15. 天宝数字水准仪数据格式转换
  16. MacBook Pro win7系统下使用 苹果鼠标 apple mouse
  17. java如何处理锯齿_java – 平滑锯齿的路径
  18. android 语音识别
  19. Kmeans K均值聚类,OpenCV实现
  20. 如何移除 “顺网云盘”

热门文章

  1. 李进祥发现并挖掘了“清水河”文学地理
  2. 《英语学习漫谈》讲话大纲---谢伟荣
  3. 云创大数据总裁刘鹏教授受聘为中国大数据技术与应用联盟副理事长
  4. Python书籍推荐,新手入门必读
  5. 随笔——自己制作python编译器——pip.exe的复制修改
  6. 重启网卡提示Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization.
  7. 网页设计作业——仿oppo官网手机商城(1页) HTML+CSS+JavaScript 学大学生网页制作期末作业
  8. gitlab 社区版或企业版 的区别
  9. 盘点腾讯十大成功产品
  10. django 一对多的添加记录create 和save 方法,update 更新和save()方法的区别,查询API的方法...