前言:本期时关于c语言题目——单词倒排的具体解法
题目:
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 1≤�≤10000 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. 所有不是大小写字母的字符都被视作单词分割符
2. 将所有单词分割符置成字符串的结束标志 '\0 '
3. 用指针数组存储每个单词的首地址
4. 倒序打印指针数组的内容
代码分析:
part 1:
char arr[10004] = { 0 };
gets(arr);
char* p = arr;
char* str[10004] = { NULL };
int i = 0;
1.用gets函数读取字符串,优势是可以读取含空格的字符串,将字符串存入arr数组中
将arr数组的首元素地址存入p指针
2.创建一个指针数组str用于存放每个单词的首元素地址,定义i作为str数组的下标
part 2:
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++;
}
处理输入的字符串:
用while循环达到分割处理多个单词的效果
while循环内部,分割处理一个单词的过程:
1.若是*p的内容是合法的大小写字母,则是一个单词的首个字母,将它的地址存入str数组中
if ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
2. 走完这一个单词:一个单词结束的标识是它的末尾有不是大小写字母的字符
while ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
{
p++;
}
3. 一个单词走完后,它末尾的非大小写字母的字符置成字符串的结束标志: '\0 '
4. p++,接着处理下一个单词
part 3:
逆序打印指针数组str中的已经分割好的单词:
tips:由于str数组的下标i的表达式是i++,后置++,会致使下标i在存入最后一个单词的地址后,
再次++,故而打印str数组内容时,需要先让i-1,才是str指针数组最后一个元素的下标
int j = 0;
for (j = i - 1; j >= 0; j--)
{
printf("%s ", str[j]);
}
本期完。