解题思路与过程
- 📽️解题思路
- 📽️解题过程
- 🔧1.输入
- 🔧2.设计逆序函数
- 🔧3.逆序整个字符串
- 🔧4.逆序每个单词
- 📽️源码
📷先来看题👇
📽️解题思路
🔴 首先我们定义一个字符数组来存放字符串,然后用 gets函数来读入字符串,接下来进行处理阶段,设计一个逆序函数逆序整个字符串,然后再逆序每个单词,最后处理一下细节再输出
📽️解题过程
🔧1.输入
定义完一个字符数组后,因为scanf不吃空格符和换行符,所以这里输入我们采用gets函数来进行读入字符串,看代码👇
int main()
{
char arr[101] = { 0 };
//输入
gets(arr);
🔧2.设计逆序函数
看代码👇
void reverse(char* left, char* right)
{
assert(*left != NULL);
assert(*right != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
☝️字符串的首尾元素逐个进行交换(不包括\0)☝️
因为传过来的是数组首元素地址,所以我们要用指针变量来接收,为了代码更谨慎,这里使用了assert断言,防止遇到空指针而导致程序运行错误(不能忘记引头文件<assert.h>)
🔧3.逆序整个字符串
int len = strlen(arr);
//逆序整个字符串
reverse(arr, arr + len - 1);
👉我们使用strlen函数来计算字符串元素个数(不要忘记引头文件<string.h>),然后调用 reverse函数进行整个字符串的逆置。
👉这里的 arr + len - 1是首元素地址+字符串长度(整数)- 1 得到的是末尾元素的地址(如果不 - 1指向的就是 ’\0‘了)
🔧4.逆序每个单词
char* cur = arr;
while (*cur)
{
//找一个单词
char* start = cur;
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur == ' ')
{
cur++;
}
}
👉定义一个指针变量cur来接收逆序整个字符串之后的arr数组首元素地址,然后如果cur指向的字符不是’\0’的话就进入循环,然后再定义一个指针变量start来接收每个单词的首元素地址,然后进入循环判断如果cur指向的不是空格或者’\0’就往后跳一个字符,直到cur指向的是空格或者’\0‘了,就说明已经遍历完确认了一个单词,然后进入reverse函数 来逆序单词(cur - 1 是因为如果不 -1,cur指向的是空格或者’\0‘)
👉最后如果cur指向的是空格而不是’\0‘就说明还没有结束,还有单词没有逆序完,往后跳一个字符循环继续
👉最后打印输出
📽️源码
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{
assert(*left != NULL);
assert(*right != NULL);
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* cur = arr;
while (*cur)
{
//找一个单词
char* start = cur;
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
if (*cur == ' ')
{
cur++;
}
}
//打印
printf("%s\n", arr);
return 0;
}
🥰希望大家能够理解!
总结🥰
本文章旨在【C语言刷题】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
希望我们可以做一个用心的人💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰