ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

 

思路:先反转整个字符串,再分别反转每一个单词。

反转字符串代码:

 1 void ReverseString(char *Str)
 2 {
 3     assert (Str != NULL);
 4 
 5     int nLength = strlen (Str);
 6 
 7     // 首先反转整个字符串
 8     ReverseWord (Str, nLength);
 9 
10     // 接下来分别反转每个单词,单词以空格分开
11     char *pStr1 = Str;
12     char *pStr2 = NULL;
13 
14     while (*pStr1 != '\0')
15     {
16         // 确定单词的合法首字母
17         if (*pStr1 != ' ')
18         {
19             pStr2 = pStr1 + 1;
20 
21             while ((*pStr2 != ' ') && (*pStr2 != '\0'))
22             {
23                 ++pStr2;
24             }
25 
26             // 确定了一个单词,将其反转
27             ReverseWord (pStr1, pStr2 - pStr1);
28 
29             pStr1 = pStr2;
30         }
31         else
32         {
33             ++pStr1;
34         }
35     }
36 }

其中ReverseWord这个函数实现如下:

 1 void ReverseWord(char *Str, int N)
 2 {
 3     assert (Str != NULL);
 4 
 5     assert (N > 0);
 6 
 7     char *p1 = Str;
 8     char *p2 = Str + N - 1;
 9 
10     while (p1 < p2)
11     {
12         char ch = *p1;
13         *p1 = *p2;
14         *p2 = ch;
15 
16 
17         // 这两步不能忘
18         ++p1;
19         --p2;
20     }
21 }

  最后给出一些测试结果:

包含多个单词的字符串反转结果:

只有一个单词的字符串反转结果:

只有一个单词,并且这个单词只有一个字母的反转结果:

只包含一个空格的字符串的反转结果(其实什么也没有,但这就是正常结果):

posted on 2013-04-30 21:48  ldjhust  阅读(183)  评论(0编辑  收藏  举报