C语言刷题之倒置字符串的解题全过程
作者:C-调战士
先来看题
解题思路
🔴 首先我们定义一个字符数组来存放字符串,然后用 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语言刷题之倒置字符串的文章就介绍到这了,更多相关C语言倒置字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!