题目描述:将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。
文章目录
- 原题目
- 题目描述:
- 输入描述:
- 输出描述:
- 题目链接:
- 整体思路
- 分步实现
- 1. 输入字符串
- 2. 逆序功能
- 3. 整句话逆序
- 4. 单词逆序
- 5. 整体代码和oj结果
- 写在最后
原题目
题目描述:
将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。
字符串长度不超过100。
输入描述:
输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。
‘.’ 只出现在最后一个单词的末尾。
输出描述:
依次输出倒置之后的字符串,以空格分割。
题目链接:
https://www.nowcoder.com/questionTerminal/8869d99cf1264e60a6d9eff4295e5bab
整体思路
先将整句话逆序处理,然后再将每个单词进行逆序,这样一来整句话的顺序虽然颠倒了,但是单词因为逆序了两次,还是正常顺序。
分步实现
1. 输入字符串
利用gets函数输入获取整句话的字符串。
#include <stdio.h>
int main()
{
char arr[100];
gets(arr);//和scanf函数类似,获取键盘输入的字符
printf("%s", arr);//测试是否获取到了
return 0;
}
编译结果:
2. 逆序功能
自定义写一个reverse函数,利用指针来逆序字符串的内容,之所以写成函数是因为这个功能需要复用。
利用数组在栈区中存放时,下标由小到大,地址由低到高存放的原理,判断其首元素地址和末位元素的地址,如果左边的地址小于右边,使用指针进行元素交换,并且左边指针++,右边指针–,重新进行循环判断,直到左边大于等于右边,则跳出循环,这样就可以完成字符串的逆序操作。
#include<string.h>
void reverse(char* left, char* right)
{
char tmp;
while (left < right)
{
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
3. 整句话逆序
利用strlen函数,求得字符串长度,就可以利用reverse函数将首元素地址,和首元素地址加字符串长度减一,将整句话逆序。
#include <stdio.h>
int main()
{
char arr[100];
gets(arr);
int len = strlen(arr);
reverse(arr, arr + len - 1);//传入首元素地址和末位元素地址
printf("%s\n", arr);//测试用
return 0;
}
编译结果:
4. 单词逆序
利用指针来判断是否遇到了空格或者\0
,没有遇到的话,指针向前走,如果遇到了,就将之前的内容逆序一次,直到指针走到\0
,跳出循环。
int main()
{
char arr[100];
gets(arr);
int len = strlen(arr);
reverse(arr, arr + len - 1);
char* cur = arr;//cur作为光标遍历整个字符串并进行判断
char* start = arr;//start作为每个单词的第一个元素地址指针用
while (*cur)
{
while (*cur != ' ' && *cur != '\0')
{
cur++;//不是空格或者\0,指针就向前走
}
reverse(start, cur - 1);//将这个单词的开头和末位地址传入reverse进行逆序
start = cur + 1;//start去指向新单词的开头
if (*cur != '\0')//直到*cur(数组元素)等于\0时,cur(指针)停止++,并且在while循环处跳出循环(因为\0就是0,为假)
{
cur++;
}
}
printf("%s\n", arr);//打印字符串
return 0;
}
编译结果:
5. 整体代码和oj结果
#include <stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
char tmp;
while (left < right)
{
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100];
gets(arr);
int len = strlen(arr);
reverse(arr, arr + len - 1);
char* cur = arr;
char* start = arr;
while (*cur)
{
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
start = cur + 1;
if (*cur != '\0')
{
cur++;
}
}
printf("%s\n", arr);
return 0;
}
写在最后
如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。
博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。
谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!