博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串反转问题
阅读量:6160 次
发布时间:2019-06-21

本文共 5195 字,大约阅读时间需要 17 分钟。

首先是我之前写的程序,同时这也是处理第一类的字符串反转问题,也就是输入This is a string.,输出为.gnirts a si sihT:

#include 
#include
/*我之前的这个代码,有一个很致命的BUG,在字符串长度为奇数的时候运行时正确的 *但是在字符串长度为偶数的时候运行却是错误的, *比如“ab”,str的地址为0x89,ptr的地址为0x8A,当str++,ptr--执行以后 *str和ptr都是不会相等的,也就是不会结束while循环!!!直到碰巧两者相等 *循环结束,但此时程序已经得不到原先想要的结果了!!! */void RevStr(char*str){ int len; char*ptr; len = strlen(str); ptr = str + len -1; while(str != ptr) { char ch; ch =*str; *str =*ptr; *ptr = ch; str++; ptr--; }}int main(){ char str[] ="This is a string."; RevStr(str); printf("%s/n",str); return0;}

 

在论坛发帖求教后,发现了上述问题,然后改进后的代码如下:

1 #include 
2 #include
3 4 5 void RevStr(char *str) 6 { 7 int len; 8 char *ptr; 9 10 len = strlen(str);11 ptr = str + len - 1;12 13 while(str != ptr)14 {15 char ch;16 ch = *str;17 *str = *ptr;18 *ptr = ch;19 str++;20 //ptr自减前,在这里加一个判断,如果相等则结束循环21 //否则ptr就减一22 if(str == ptr)23 break;24 else25 ptr--;26 27 }28 }29 30 int main()31 {32 char str[] = "This is a string";33 RevStr(str);34 printf("%s\n",str);35 return 0;36 }

 

 输出结果为:

字符串反转问题的第二类问题是,对于This is a string,最终反转成string a is This。网上对于这个问题,有说用栈来处理。我在看到这个要求,想到上面做的反转问题,觉得可以这样来做:首先,将整个字符串都反转,得到gnirts a si sihT,然后在对每个单词进行反转得到最终的结果,string a is This。

源代码如下:

1 #include 
2 3 int Ustrlen(const char *strSource) 4 { 5 // 声明变量 6 int iLength(0); 7 // 遍历字符串,查找字符'/0' 8 while(*strSource++ != '\0') 9 {10 ++iLength;11 }12 // 返回字符串的长度13 return iLength;14 }15 /************************************************************************/16 // 函数名称: _ReversalChar17 // 输入参数: strSouce,待反转字符串;iStart,旋转字符串开始位置;iEnd,旋转字符串结束位置18 // 输出参数: char*,反转后字符串的指针;19 // 描 述: 反转iStart到字符串iEnd之间的字符串20 /************************************************************************/21 char* _ReversalChar(char *strSouce,int iStart,int iEnd)22 {23 // 反转字符串24 for(;iEnd > iStart; ++iStart,--iEnd)25 {26 char ch;27 ch = strSouce[iStart];28 strSouce[iStart] = strSouce[iEnd];29 strSouce[iEnd] = ch;30 }31 // 返回字符串指针32 return strSouce;33 }34 35 /************************************************************************/36 // 函数名称: ReversalChar37 // 输入参数: strSource,待反转字符串38 // 输出参数: char*,反转字符串后的指针39 // 描 述: 按单词反转字符串40 /************************************************************************/41 char * ReversalChar(char *strSouce)42 {43 // 获取字符串的长度44 int iLength = Ustrlen(strSouce);45 46 // 反转整个字符串47 _ReversalChar(strSouce,0,iLength-1);48 49 // 声明变量(单词的开始以及结束默认从0开始)50 int iStart(0),iEnd(0);51 52 // 查找单词53 // 像上面讨论的查找单词的情况,我们只需要修改这部分,就可以实现对不54 // 同格式类型单词进行处理,为了更好的通用性,其实最好把查找单词这部分55 // 作为单独一个函数,或者一个类来处理56 for(int i = 0; i <= iLength; ++i)57 {58 // 查找空格分割符号59 //if语句里面第二个判断是用于最后一个单词,不加这个判断最后一个单词反转不了,因为60 //最后一个单词后面没有空格的,所以只能靠结束符'/0'来判断到达字符串尾,再对其反转61 if(strSouce[i] == ' ' || strSouce[i] == '/0')62 {63 // 找到一个单词64 iEnd = i-1;65 // 对于只有一个字符的单词比如说(I)没有必要反转66 if(iStart < iEnd)67 {68 // 反转单词69 _ReversalChar(strSouce,iStart,iEnd);70 }71 // 记录下一个单词的开始位置72 iStart = i+1;73 }74 // 特殊处理几种常见标点符号75 else if(strSouce[i] == '!' || strSouce[i] == ',' || strSouce[i] == '.')76 {77 iStart = i+1;78 }79 }80 // 返回反转后的字符串81 return strSouce;82 }83 84 int main()85 {86 char *ptr;87 char str[] = "This is a string.";88 89 ptr = ReversalChar(str);90 printf("%s\n",ptr);91 92 return 0;93 }

 输出结果为:

给定一字符串,将每个单词的字符顺序倒置,单词间的顺序不变。例如:输入字符串“I love you”,输出“I evol uoy”。

1 #include 
2 #include
3 using namespace std; 4 5 //计算并返回字符串长度 6 int Length(char *str) 7 { 8 int length=0; 9 while((*str++)!='\0')10 length++;11 return length;12 }13 14 //对单个单词字符反转15 void _Reverse(char *str,int low,int high)16 {17 char tempChar;18 while(low
>s;)34 {35 length=Length(&s[0]);36 _Reverse(&s[0],0,length-1);37 cout<
<<" ";38 }39 }40 41 //反转的另一个方法,直接对原字符串操作42 void ReverseVer2(char *str)43 {44 int low,high;45 int length=Length(str);46 for(int i=0;i<=length;i++)47 {48 if(i==0&&str[i]!='\40')49 {50 low=i;51 continue;52 }53 if(str[i]!='\40'&&str[i-1]=='\40')54 {55 low=i;56 continue;57 }58 if(str[i]=='\40'||str[i]=='\0')59 {60 high=i-1;61 _Reverse(str,low,high);62 }63 }64 }65 66 int main()67 {68 char str[]="I love you";69 cout<<"first method:";70 Reverse(str);71 cout<

输出为:

本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3172475.html,如需转载请自行联系原作者

你可能感兴趣的文章
CCNA考试要点大搜集(二)
查看>>
ajax查询数据库时数据无法更新的问题
查看>>
Kickstart 无人职守安装,终于搞定了。
查看>>
linux开源万岁
查看>>
linux/CentOS6忘记root密码解决办法
查看>>
25个常用的Linux iptables规则
查看>>
集中管理系统--puppet
查看>>
分布式事务最终一致性常用方案
查看>>
Exchange 2013 PowerShell配置文件
查看>>
JavaAPI详解系列(1):String类(1)
查看>>
HTML条件注释判断IE<!--[if IE]><!--[if lt IE 9]>
查看>>
发布和逸出-构造过程中使this引用逸出
查看>>
使用SanLock建立简单的HA服务
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>