「题解」字符串中的所有单词进行倒排
题目要求
1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符; 4、每个单词最长20个字母;
事例
输入:I love you bit 输入:I @@like%*cpp21 输出:bit you love I 输出:cpp like I
🏡解题思路
首先定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母符全部替换成为字符串结尾的标志,则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多少字符串,最终对字符指针数组进行逆序输出每个单词即可
🏡源码分享
#include<stdio.h> #include<string.h> int main() { char str[100001]={0}; int row=0; while(gets(str)>0) { char* ptr=str; char* word[10000]={NULL}; while(*ptr!= ) { if((z>=*ptr&&*ptr>=a)||(Z>=*ptr&&*ptr>=A)) { word[row++]=ptr; while(*ptr!= &&((z>=*ptr&&*ptr>=a)||(Z>=*ptr&&*ptr>=A))) { ptr++; } continue; } *ptr= ; ptr++; } for(int i=row-1;i>=0;i--) { printf("%s ",word[i]); } printf(" "); } return 0; }
🏡代码分析
🤔可以多次输入字符串进行调试 while(gets(str)>0) 创建指针数组(注意是指针数组而不是数组指针),去存放每个单词的首地址。有些伙伴会问为什么要用指针数组呢?为啥不直接创建指针去存放地址呢?首先,我不知道创建多少个指针才合适,其次,创建这么多指针,怎么去给他们赋值,怎么去命名。这些都是一些不可忽视问题,但是指针数组可以有效去解决这些问题。 char* word[10000]={NULL}; 🤔如果是字母字符,则是单词的起始字符 if((z>=*ptr&&*ptr>=a)||(Z>=*ptr&&*ptr>=A)) 🤔保存每个单词的起始地址 word[row++]=ptr; 🤔把本次的单词字母字符走完,直到遇到非字符字母 while(*ptr!= &&((z>=*ptr&&*ptr>=a)||(Z>=*ptr&&*ptr>=A))) 🤔不能继续向下,因为下边的ptr++会跳过当前非字母字符 continue; 🤔把非字母字符替换为字符串的结尾标志 *ptr= ; 🤔针对所有单词的起始地址逆序输出 printf("%s",word[i]);
🌸🌸🌸希望通过这道题可以帮助大家提升学习编程的能力,以后遇到这种就可所向披里如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸