题目描述
将一句话的单词进行倒置,标点不倒置。比如 “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、使用指针移动时要注意每个时刻指针指向的位置避免发生错误