题目:请输入一个带空格的英文短语,输入长度不超过100个字符。将一句话中的单词进行倒置,标点不倒置。比如输入:I like beijing. 经过倒置后为:beijing. like I 请编写代码实现该功能。
注意:这里的倒置字符串的单位是单词,而不是字符。因为以字符为单位的倒置结果为 .gnijieb ekil I 千万被搞错了。
方法一:
我们可以从输入字符串的末尾字符开始向前访问直到遇见空格才停下,接着将之前访问过的部分拷贝到新的数组中,然后将空格改为 ‘\0’ 。以此为循环一直向前访问,而循环结束条件是访问到字符串起始位置。大致的解题方向就是这样了,细节编写代码是再思考。
//方法一:
#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
char arr1[101] = { 0 };
//计算字符串长度
int len = strlen(str);
//创建指针指向字符串末尾
char* end = str + len - 1;
while (1)
{
//1.向前访问直至遇见空格
while (*end != ' ' && str < end)
{
end--;
}
if (*end == ' ')
{
//2.将空格后‘\0’以及‘\0’前的部分链接到新数组中去
strcat(arr1, end + 1);
//3.然后将拷贝过去的‘\0’改为空格
len = strlen(arr1);
*(arr1 + len) = ' ';
//4.将此刻end指向的空格改为‘\0’
//,以便下一次只拷贝到该处就结束
*end = '\0';
end--;
}
else
{
//5.将最前面的单词连同‘\0’一起链接到arr1数组的最后面
strcat(arr1, end);
//6.将倒置好的数组arr1赋给原数组
strcpy(str, arr1);
break;
}
}
}
int main()
{
char arr[101] = { 0 };
//输入字符串
gets(arr);
//倒置字符串
reverse(arr);
printf("%s\n", arr);
return 0;
}
方法二:
此方法又被情切的称为:三步翻转法。首先逆置整个字符串,然后每个单词再进行一次逆置就可以达到,整体倒置的目的了。如下图所示:
//方法二(三步翻转法)
#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] = { 0 };
gets(arr);
int len = strlen(arr);
//将整个字符串进行逆置
reverse(arr, arr + len - 1);
//逆置每个单词
char* start = arr;
char* end = start;
while (*end)
{
//1.end指针向后访问直至遇到空格
while (*end != ' ' && *end != '\0')
{
end++;
}
//2.逆置单词
reverse(start, end - 1);
if (*end != '\0')
{
end++;
start = end;
}
}
printf("%s\n", arr);
return 0;
}
这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。