题目描述:
将一句话的单词进行倒置,标点不倒置。
输入描述:
每次测试会输入1个测试用例, 输入用例的长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
eg:
输入:i like beijing
输出:beijing. like i
解题思路:
将整句话先逆置一遍,然后在逐个单词进行逆置。
注意:
1.把逆置的具体算法单独写出来,这有利于在逆置每个单词或句子都可以复用代码,这样代码逻辑会很清晰;
2.scanf函数不支持在键盘上读取一段完整的英语句子(因为其碰到空格或‘/0’就会停止读入,因此下文用了gets函数;
代码实现:
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
void reverse_(char* left, char*right)
{
assert(left&&right);
while(left<right)
{
char ret = *left;
*left=*right;
*right=ret;
left++;
right--;
}
}
void reverse(char* arr,int len)
{
reverse_(arr,arr+len-1);//先把整个句子逆置一遍
while(*arr)//逆置每个单词
{
char* begin = arr;
while(*arr && (*arr != ' '))//英语中单词的结尾为空格或者‘\0’
{
arr++;//用arr记录每个单词的最后一个位置
}
reverse_(begin,arr-1);//具体逆置每个单词
if(*begin == ' ')//逆置一个单词之后 arr指针会走到空格的地方
//因此需要下边执行一个++操作
{
arr++;
}
}
}
//测试
int main()
{
char arr[100];
gets(arr);
int len=strlen(arr);
reverse(arr,len);
printf("%s\n",arr);
system("pause");
return 0;
}