【字符串问题】将一个字符串中的单词进行倒置

2013-09-15 14:49:09

将一个字符串中的单词进行倒置,标点符号也倒置,

如输入:hello,nice to meet you!

输出:!you meet to nice,hello

将代码中的while ( *pCur && IsAlphabet(*pCur) )

换成while ( *pCur && *pCur!= ' ' ) 

即可实现翻转单词,标点符号不倒换,

即输入:hello,nice to meet you!

输出:you! meet to hello,nice

注意TestDriver函数中不能定义输入为:

pCHAR srcStrArray[] = {"0123456","i am a good boy!","hello",""};

因为这样的话,每个char*的指针指向的是静态区,静态区的数据就不能改变,在运行时到ReverseString(char *pSrc,size_t begin,size_t end)函数的 *(pStr + index) = *(pSrc + end - index);就会出错,因为该语句试图改变静态区的数据,是不允许的。

这样的错误,类似于下面的:

char *pStr1 = "hello";

char *pStr2[] = "hello";

可以用*pStr2 = ‘a’;改变pStr2指向的字符串,改变后为"aello";

但不可改变pStr1指向的字符串的内容,因此*pStr1 = ‘a’;是不允许的。


代码(测试暂未发现错误,欢迎交流指正!):

 1 #include <iostream>
 2 #include <cassert>
 3 using namespace std;
 4 
 5 //翻转首地址为pSrc,索引从begin到end的字符
 6 void ReverseString(char *pSrc,size_t begin,size_t end)
 7 {
 8     assert(pSrc != NULL);
 9     char *pStr = (char *)(pSrc + begin);
10     char tmpChar;
11     size_t index = 0;
12 
13     while ( 2 * index < (end - begin) )
14     {
15         tmpChar = *(pStr + index);
16         *(pStr + index) = *(pSrc + end - index);
17         *(pSrc + end - index) = tmpChar;
18 
19         ++index;
20     }
21 }
22 
23 //判断字符是否为字母
24 bool IsAlphabet(char ch)
25 {
26     return ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') );
27 }
28 
29 //翻转单词
30 char * ReverseWord(char *pStr)  //不能定义为const
31 {
32     assert(pStr != NULL);
33     size_t len = strlen(pStr);
34 
35     if (len == 0)  //对空串的处理
36     {
37         return pStr;
38     }
39 
40     ReverseString(pStr,0,len - 1);
41     cout<<pStr<<endl;
42 
43     char *pCur = (char *)pStr;
44     int wordBegin = 0;
45     int wordEnd = 0;
46 
47     while (*pCur)
48     {
49         wordBegin = pCur - pStr;
50 
51         while ( *pCur && IsAlphabet(*pCur) )
52         {
53             ++pCur;
54         }
55 
56         wordEnd = pCur - 1 - pStr;  //pCur与pStr相等时,wordEnd定义为size_t会出错
57 
58         if (wordBegin < wordEnd)
59         {
60             ReverseString(pStr,wordBegin,wordEnd);
61         }
62 
63         ++pCur;
64     }
65     return pStr;
66 }
67 
68 
69 typedef char *  pCHAR;
70 
71 void TestDriver()
72 {
73     //pCHAR srcStrArray[] = {"0123456","i am a good boy!","hello",""};
74     char srcStrArray[][100] = {"0123456","i am a good boy!","hello,nice to meet you!",""};
75     size_t arrayLength = 4;
76 
77     pCHAR srcStr;
78 
79     for (size_t index = 0;index < arrayLength;++index)
80     {
81         srcStr = srcStrArray[index];
82         cout<<"the source string is : "<<srcStr<<endl;
83 
84         ReverseWord(srcStr);
85         cout<<"the reversed string is : "<<srcStr<<endl<<endl;
86     }
87 }
88 
89 int main()
90 {
91     TestDriver();
92     return 0;
93 }

测试结果:

the source string is : 0123456
6543210
the reversed string is : 6543210

the source string is : i am a good boy!
!yob doog a ma i
the reversed string is : !boy good a am i

the source string is : hello,nice to meet you!
!uoy teem ot ecin,olleh
the reversed string is : !you meet to nice,hello

the source string is :
the reversed string is :

请按任意键继续. . .

将代码中的while ( *pCur && IsAlphabet(*pCur) )

换成while ( *pCur && *pCur!= ' ' ) 

即可实现翻转单词,标点符号不倒换,测试结果:

the source string is : 0123456
6543210
the reversed string is : 0123456

the source string is : i am a good boy!
!yob doog a ma i
the reversed string is : boy! good a am i

the source string is : hello,nice to meet you!
!uoy teem ot ecin,olleh
the reversed string is : you! meet to hello,nice

the source string is :
the reversed string is :

请按任意键继续. . .
原文地址:https://www.cnblogs.com/youngforever/p/3322546.html