单词倒排(详解)

该文章介绍了一种使用C语言解决字符串中单词倒排问题的方法。通过读取输入的句子,将非字母字符视为单词分隔符,然后存储每个单词的首地址到指针数组,最后逆序遍历并打印指针数组内容,从而实现单词倒排。代码实现了从输入字符串中分割单词、存储单词首地址和倒序输出的功能。
摘要由CSDN通过智能技术生成

前言:本期时关于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]);
	}

本期完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值