前言:内容包括四大模块:题目,代码实现,大致思路,代码解读
题目:
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 1≤n≤10000
输入描述:
输入一行,表示用来倒排的句子
输出描述:
输出句子的倒排结果
示例1
输入:
I am a student
输出:
student a am I
示例2
输入:
$bo*y gi!r#l
输出:
l r gi y bo
代码实现:
#include<stdio.h>
int main()
{
char arr[10004] = { 0 };
gets(arr);
char* p = arr;
char* str[10004] = { NULL };
int i = 0;
while (*p != '\0')
{
if ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
{
str[i++] = p;
while ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
{
p++;
}
}
*p = '\0';
p++;
}
int j = 0;
for (j = i - 1; j >= 0; j--)
{
printf("%s ", str[j]);
}
}
大致思路:
1. 将字符串分割成独立的单词存入字符指针数组中
way:字符指针数组存储每个单词的起始地址
a. 使用一个字符指针去遍历读取的字符串,字符指针开头一定指向的是一个单词的首字母
(注意可能一个非法单词是由多个空格组成的,即字符指针可能开头指向的是非字母字符)
将每一个单词的末尾(比如空格)改成字符串的结束标志'\0'
2. 倒序打印存储好每个单词的字符指针数组
代码解读:
part 1
char arr[10004] = { 0 };
gets(arr);
char* p = arr;
char* str[10004] = { NULL };
使用gets可以读取带有空格的字符串,存储到arr数组中
创建一个字符指针数组str用于存放每个单词的起始地址
创建字符指针p去遍历arr数组
part 2
int i = 0;
while (*p != '\0')
{
if ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
{
str[i++] = p;
while ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
{
p++;
}
}
*p = '\0';
p++;
}
字符指针p开头指向的一定是一个单词的首字母(单词包括合法单词:由字母组成,非法单词:由非字母字符组成)
1.若是*p是字母,则已经来到一个单词的首字母位置,将这个单词的起始地址保存到str数组中
然后需要走到单词的末尾,分割出这个单词
分割:从一个单词的起始地址开始走,若是下一个字符是字母,则继续走,直至碰到不是字母的字符,这表示一个完整的单词已经走完了,我们需要将这个不是字母的字符改成字符串的结束标志'\0'
2. 一个单词分割结束后,p++,指向下一个单词的首字母,继续上面的操作
part 3
int j = 0;
for (j = i - 1; j >= 0; j--)
{
printf("%s ", str[j]);
}
倒序打印str数组中的内容,由于i++是后置++,在最后一个单词存储到str数组后,i会继续向后走一步,故而我们设定数组最后一个元素的下标为i-1