题目描述
将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。字符串长度不超过100。
输入描述
输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。‘.’ 只出现在最后一个单词的末尾。
输出描述
依次输出倒置之后的字符串,以空格分割。
示例
输入
I like beijing.
输出
beijing. like I
1、解题思想
I like beijing.
对于这个字符串单词的逆置可以有两种思路:
- 先逆序整个字符串
.gnijieb ekil I
- 再逆序每个单词
beijing. like I
第二种
- 先逆序每个单词
I ekil .gnijieb
- 再逆序整个字符串
beijing. like I
2、具体实现
无论按照哪个思路来进行解题我们都需要进行多次字符串的逆序,所以我们可以写一个函数来完成这一功能:
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
完成逆序函数后就可以完成主函数的书写了
int main()
{
char arr[101] ;
gets(arr);//gets可以读取中间有空格的字符串
int len = strlen(arr);
reverse(arr, arr + len - 1);//将字符串整体逆序
char* start = arr;
char* cur = arr;
while (*cur)//cur指针到'\0'退出循环
{
//先找到一个单词的后一位
while (*cur != ' '&&*cur!='\0')
{
cur++;
}
reverse(start, cur - 1);//将每个单词进行逆序
start = cur + 1;//让头指针指向下一个单词的第一个
if (*cur == ' ')//当到了整个字符串的最后一位
//cur指向'\0'后不再后移,否则循环判断条件就会失效
{
cur++;
}
}
printf("%s", arr);
return 0;
}
3、整体代码及运行测试
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] ;
gets(arr);
int len = strlen(arr);
reverse(arr, arr + len - 1);
char* start = arr;
char* cur = arr;
while (*cur)
{
while (*cur != ' '&&*cur!='\0')
{
cur++;
}
reverse(start, cur - 1);
start = cur + 1;
if (*cur == ' ')
{
cur++;
}
}
printf("%s", arr);
return 0;
}
做题小技巧
1、scanf函数输入时遇到空格或换行就会停止,可以使用gets进行输入
2、使用指针移动时要注意每个时刻指针指向的位置避免发生错误