字符串反转问题

首先是我之前写的程序,同时这也是处理第一类的字符串反转问题,也就是输入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 }

输出为:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏代码世界

Python基础数据类型之int、bool、str

数据类型:int  bool  str  list  元祖  dict  集合 int:整数型,用于各种数学运算。 bool:只有两种,True和False,用...

34960
来自专栏向治洪

Kotlin基础之泛型

泛型 与Java一样,Koltin的类也有类型参数。例如: class Box<T>(t: T){ var value = t } 常规来说,创建这样的...

20070
来自专栏CodingBlock

正则表达式(一)

  正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。找到匹配这些模式的部分就可以对...

206100
来自专栏CVer

Python Numpy学习教程(一)Python篇

通知:这篇文章主要简单介绍Python的基本数据结构、容器、列表、字典、集合、元组、函数和类等知识点 Python Numpy学习教程 Author: ...

1K140
来自专栏老马说编程

(91) Lambda表达式 / 计算机程序的思维逻辑

在之前的章节中,我们的讨论基本都是基于Java 7的,从本节开始,我们探讨Java 8的一些特性,主要内容包括: 传递行为代码 - Lambda表达式 函数式...

20980
来自专栏salesforce零基础学习

salesforce零基础学习(七十九)简单排序浅谈 篇一

我们在程序中经常需要对数据列表进行排序,有时候使用SOQL的order by 不一定能完全符合需求,需要对数据进行排序,排序可以有多种方式,不同的方式针对不同的...

23670
来自专栏韦弦的偶尔分享

Swift 回文链表 - LeetCode

14020
来自专栏数据结构与算法

17:字符串判等

17:字符串判等 总时间限制: 1000ms 内存限制: 65536kB描述 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。 ...

38290
来自专栏CodingToDie

Python学习(五):函数

第5 章 函数 Table of Contents 函数调用 数据类型转换 定义函数 空函数 返回多个值 tuple 函数调用 Python内置了很多有用的函数...

47550
来自专栏个人随笔

房上的猫:java基础知识部分知识点

1.Java常见的注释有哪些,语法是怎样的?  1)单行注释用//表示,编译器看到//会忽略该行//后的所文本  2)多行注释/* */表示,编译器看到/*时...

372140

扫码关注云+社区

领取腾讯云代金券