字符串反转问题

简介: 首先是我之前写的程序,同时这也是处理第一类的字符串反转问题,也就是输入This is a string.,输出为.gnirts a si sihT: #include #include /*我之前的这个代码,有一个很致命的BUG,在字符串长度为奇数的时候运行时正确的 *但是在...

 

首先是我之前写的程序,同时这也是处理第一类的字符串反转问题,也就是输入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("%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 <stdio.h>
 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 // 函数名称: _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("%s\n",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++)!='\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<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]=='\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<<endl;
72     ReverseVer2(str);
73     cout<<"second method:"<<str<<endl;
74     return 0;
75 }

输出为:

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
17天前
字符串反转
【6月更文挑战第18天】字符串反转。
8 1
|
2月前
反转字符串
反转字符串
27 1
|
2月前
|
Python
ptthon字符串的逆序输出
字符串的逆序输出
28 0
|
12月前
撕碎字符串反转【C】
首先我们对题目进行分析,反转字符串就是将数组中的元素位置进行互换从而达到效果,但是当我们对字符串前后进行互换时,会出现”.gnijieb ekil I"这与我们预先的目标不一致,这个题就特殊在这里。我们要进行二次交换,对字符串中的每个单词进行交换,把每一个单词看作一个整体在进行一次数组交换即可。
49 0
|
算法 C++
在 C/C++ 中反转字符串的不同方法
给定一个字符串,编写一个 C/C++ 程序来反转它。
96 0
C/C++编程题之字符串反转
C/C++编程题之字符串反转
|
机器学习/深度学习 NoSQL Shell
344. 反转字符串
344. 反转字符串
74 0
|
机器学习/深度学习 NoSQL 算法
字符串——344.反转字符串
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
字符串——344.反转字符串
Day8——反转字符串、反转字符串||、替换空格、反转字符串里的单词、左旋字符串
Day8——反转字符串、反转字符串||、替换空格、反转字符串里的单词、左旋字符串
88 0
字符串——541. 反转字符串 II
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19