用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;
}
文章如果有问题的话,还请大佬们不吝赐教!
如果您觉得我写的不错,不妨点个赞支持一下哦~