在学习过程中,遇到这样一个功能:请输入一个字符串,将其逆序排列。
- 如输入"hello world",输出为"world hello"。
- 思路: 先按单词逆序,再对整个句子逆序。
- "hello world" ==> "olleh dlrow" ==> "world hello"
那么,需要做两部分功能:
第一,给定单词的首地址和尾地址,将其倒序(也就是交换功能)
第二,将一个句子拆分为每个单词:
单词尾地址根据指针q遇到(连续空格的)第一个空格判定:q-1
单词首地址根据指针q遇到的不再是空格判定
代码:
- /*************************************************
- 题目: 给定一个字符串,按单词将该字符串逆序,不包括标点
- 如输入"hello world",输出为"world hello"。
- *************************************************/
- #include<stdio.h>
#include <stdlib.h>
void reverseWord(char *start, char *end)
{
char temp;
while(start < end)
{
temp=*start ;
*start = *end;
*end = temp;
*start++;
*end--;
}
}
int main( ) {
char s[100]="i am a boy";
// printf("please input a string:\n");
//gets(s); //从stdio流中读取字符串,直至接受到换行符或EOF时停止
char *p=s;
char *q=s;
printf("倒序前:%s\n", s);
printf("开始地址:%x\n",q);
while(*q != '\0')
{
if(' ' == *q) //单词结尾:q首次遇到空格(此时将单词头地址p,和单词尾地址q-1)
{
printf("第一个空格地址:%x\n",q);
reverseWord(p,q-1);
while(' ' == *q ) //单词开头:q跳若干空格后下一单词首字符
{
printf("space skip地址:%x\n",q);
q++;
}
p=q; //单词头地址赋值给p
}
else
{
q++; //单词内部地址自加
}
}
reverseWord(p,q-1); //将最后一个单词逆序
reverseWord(s,q-1); //将整句话逆序
printf("结尾地址:%x\n",q);
printf("倒序后:%s\n", s);
system("pause");
return 0;
}
改进之处在于:
网上的答案都没有考虑如果相邻之处如果有连续空格的情况,他们对空格也不停的翻转
自己考虑到该功能其实稍微改进一下就是统计单词数功能,因此,如果遇到连续空格将其调过,仅仅对单词进行逆序。
本程序中:"i am a boy"依次为1,2,3个空格,我们很显然通过运行结果得到:
待优化处:
交换功能,可以不引入第三个变量,而是通过位操作即可完成。