用C语言将一句话的单词倒置,标点不倒置。
比如输入: i like shanghai.
输出得到: shanghai. like i
这道题目有很多种做法,既可以用递归,也可以分成两部分函数来写,本文就详细来讲解分装为两个函数的做法。
思路:我们可以轻易实现一个字符串的倒置,可以先将整个字符串来倒置,然后再设置函数来倒序每一个单词,用空格作为区分每个单词的标志,这样下来就可以实现将一句话单词倒置,标点不倒置。
主函数如下所示。
int main() { char s[100] = { 0 }; gets_s(s); int start=0, end=strlen(s); reverse(start, end, s); reverse_word(start, end, s); printf("%s", s); return 0; }
1.reverse函数的构建
首先构建reverse函数来实现整个字符串的逆转,只需创建一个中间变量即可。
void reverse(int start, int end, char s[]) { end--; while (start < end) { char tmp = s[start]; s[start] = s[end]; s[end] = tmp; start++; end--; } }
需要注意的是,为了保证下标不在标点的位置,即为了不交换符号,end一定要-1。
如果不想再函数内部减一的话,可以在进行函数传参的时候减一。
2.reverse_word函数的创建
接下来创建将每一个单词逆转的函数,我们使用两个while循环。
外层循环的循环条件为while (s[end] != '\0'),当end的位置走到'\0'的位置时,循环结束。
内部的while循环是将end移位到一个单词的末尾,也就是空格的位置,与在开头的start共同将一个单词锁定,接着就可以再次调用上面的reverse函数实现单词的逆序。
要注意的是,单词的末尾可能是'\0',为了防止s[end]取到零值而导致函数提前结束,我们将不等于零值也变为循环的条件。
将一个单词逆序之后,我们将目标转换为下一个单词,先将end的值赋给start,再让end移位到下一个空格处,锁定第二个单词。
void reverse_word(int start, int end, char s[]) { start = 0, end = 0; while (s[end] != '\0') { while (s[end] != ' '&&s[end]!='\0') { end+=1; } reverse(start, end, s); start = end+1; if(s[end]!='\0') end += 1; } }
完整代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> void reverse(int start, int end, char s[]) { end--; while (start < end) { char tmp = s[start]; s[start] = s[end]; s[end] = tmp; start++; end--; } } void reverse_word(int start, int end, char s[]) { start = 0, end = 0; while (s[end] != '\0') { while (s[end] != ' '&&s[end]!='\0') { end+=1; } reverse(start, end, s); start = end+1; if(s[end]!='\0') end += 1; } } int main() { char s[100] = { 0 }; gets_s(s); int start=0, end=strlen(s); reverse(start, end, s); reverse_word(start, end, s); printf("%s", s); return 0; }
文章如果有问题的话,还请大佬们不吝赐教!
如果您觉得我写的不错,不妨点个赞支持一下哦~