字符串反转问题
时间:2022-04-22
本文章向大家介绍字符串反转问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先是我之前写的程序,同时这也是处理第一类的字符串反转问题,也就是输入This is a string.,
输出为.gnirts a si sihT:
#include <stdio.h>
#include <string.h>/*我之前的这个代码,有一个很致命的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 <stdio.h>
2 #include <string.h>
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 else
25 ptr--;
26
27 }
28 }
29
30 int main()
31 {
32 char str[] = "This is a string";
33 RevStr(str);
34 printf("%sn",str);
35 return 0;
36 }
输出结果为:
字符串反转问题的第二类问题是,对于This is a string,最终反转成string a is This。网上对于这个问题,有说用栈来处理。我在看到这个要求,想到上面做的反转问题,觉得可以这样来做:首先,将整个字符串都反转,得到gnirts a si sihT,然后在对每个单词进行反转得到最终的结果,string a is This。
源代码如下:
1 #include <stdio.h>
2
3 int Ustrlen(const char *strSource)
4 {
5 // 声明变量
6 int iLength(0);
7 // 遍历字符串,查找字符'/0'
8 while(*strSource++ != ' ')
9 {
10 ++iLength;
11 }
12 // 返回字符串的长度
13 return iLength;
14 }
15 /************************************************************************/
16 // 函数名称: _ReversalChar
17 // 输入参数: 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 // 函数名称: ReversalChar
37 // 输入参数: 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("%sn",ptr);
91
92 return 0;
93 }
输出结果为:
给定一字符串,将每个单词的字符顺序倒置,单词间的顺序不变。例如:输入字符串“I love you”,输出“I evol uoy”。
1 #include <iostream>
2 #include <sstream>
3 using namespace std;
4
5 //计算并返回字符串长度
6 int Length(char *str)
7 {
8 int length=0;
9 while((*str++)!=' ')
10 length++;
11 return length;
12 }
13
14 //对单个单词字符反转
15 void _Reverse(char *str,int low,int high)
16 {
17 char tempChar;
18 while(low<high)
19 {
20 tempChar=str[low];
21 str[low]=str[high];
22 str[high]=tempChar;
23 low++;
24 high--;
25 }
26 }
27
28 //利用字符串流读取每个单词并将其反转,单词间有多个空格时合并为一个
29 void Reverse(char *str)
30 {
31 istringstream in(str);
32 int length;
33 for(string s;in>>s;)
34 {
35 length=Length(&s[0]);
36 _Reverse(&s[0],0,length-1);
37 cout<<s<<" ";
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]==' ')
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<<endl;
72 ReverseVer2(str);
73 cout<<"second method:"<<str<<endl;
74 return 0;
75 }
输出为:
- 使用 pandas处理股票数据并作分析
- 用R语言做时间序列分析(附数据集和源码)
- 【android开发】Android GUI系统学习1:Gralloc
- 【kaggle实战】从KNN,LR,SVM,RF到深度学习
- 开发 | 训练一个AI给颜值打分,公平公正!
- 【android开发】Android HAL模块实现
- 让剁手党洞察物体细节,“放大镜”当之无愧
- CSS3过渡,不再为JS动画而犯愁
- 【编程基础】c语言中获取整数和浮点数的符号位
- 前端特效开发 | JS实现聚光灯看图效果
- 【专业知识】Android主线程的消息系统(Handler\Looper)
- CSS3渐变,就是这么玩
- 前端特效开发 | 图片翻转的制作
- 【Windows编程】系列第四篇:使用Unicode编程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt编写安防视频监控系统35-onvif抓拍图片
- Qt音视频开发1-vlc解码播放
- 【TBase开源版测评】分布式数据自动shard分片
- STL—mt19937
- 潘石屹用Python解决100个问题 | 字符类型统计
- 潘石屹用Python解决100个问题 | 分解质因数
- 使用Java Spring消费MySQL中的数据库存储过程
- 部署 Docker 及配置
- 【Spark on K8S】Spark里的k8s client
- 【每日一题】30. Substring with Concatenation of All Words
- MySQL选错索引导致的线上慢查询事故复盘
- 【Kubernetes】additionalPrinterColumns的配置
- ES使用json字符串索引文档时报错
- VUE 过滤输入框中的特殊字符 只保存中文、英文及数字
- Java 判断一个字符串是不是由数字组成