1、问题描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
2、题目分析
本题归根结底是属于 字符串的逆序问题 ,但是为逆序里的逆序,但又考虑到字符串中有空格的存在,所以要用gets函数而不能用scanf,因为scanf默认读到空格就不再往后读,不符合题意。
ps: scanf("%d[^\n]", arr)效果和gets函数一样,但是这样不是不够方便呢?
3、算法设计
使用三步翻转法,即先将字符串整体逆置,再对逆置后的字符串中每一个单词部分进行逆置。
比如:I like beijing.
第一步,字符串整体逆置,得到:.gnijieb ekil I
第二步,将字符串中每一个单词逆置,得到:beijing. like I
这里字符串操作的实现非常关键,故单独实现一个函数进行字符串的逆置,由于每个单词的长度不一,因此通过指针来实现字符串的逆置可以对代码进行简化。
4、代码实现📝
完整代码📝
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> void reverse(char* left, char* right) { assert(left && right); while (left < right) { int tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[100] = { 0 }; gets(arr); int len = strlen(arr); //逆序 //1.逆序整个字符串 char* left = arr; char* right = arr + len - 1; reverse(left, right); //2.逆序每个单词 char* begin = arr; char* cur = arr; while (*cur!='\0') { while (*cur != ' '&& *cur !='\0') { cur++; } reverse(begin, cur - 1); begin = cur + 1; if(*cur != '\0') { cur++; } } printf("%s\n",arr); return 0; }
5、总结
本题目主要考察了字符串倒序,更多考的是对每个单词逆序时,由于每个单词的长度不一而有没有想出用指针来解决。