使字符串的单词倒序输出表示

题目

任务描述

本关任务:请实现函数 revWordoder,能够将 pa 指向的单词表字符串中的所有单词,按相反顺序放入 pb,同时去除多余的空格,单词之间只留一个空格.

例如 pa 中为 red blue, 则调用函数后,pb 中为blue red

主函数中,由用户输入不超 100 个单词,调用函数后,倒序输出。

相关知识

为了提高程序的通用性和可维护性,代码中用常量表示单词个数。

  1. #define WORDNUM 100

预处理命令 #define ,编译器编译时,会将所有WORDNUM替换成 100。

解题思路

字符串逆序本来是很容易的事情,但这道题比较麻烦的地方是,题目里要求以单词为单位进行逆序处理,但是原始数据的组织是字符数组,即以字符为单位的。因此比较简单的处理是用指针数组重新组织 pa, 让每一个数组元素指向一个单词字符串。 例如 pa中的字符串为” red blue orange “

,

这里组织的单词表,以后怎么处理都方便。

实现也比较简单,用指针 p 遍历 pa,在遍历的循环过程中,反复执行三个步骤:

  • 让p跳过连续空格,并用串尾'\0'替换空格(这里不替换也可以,只是从程序的通用性和可扩展性来看,加串尾更好。

  • 完成上一步骤后p必然指向某单词首地址,可给pword[i]赋值

  • 让p跳过该单词的其他字母,即跳非空格和非‘\0’的字符,回到第一步,准备给下一个pword[i]赋值。(注意,这里不建议使用大小写字母作判断,因为用户有可能输错单词的个别字母,要有容错性)

编程要求

根据提示,在右侧编辑器 Begin-End 内补充代码,请实现函数 revWordorder,能够将 pa 指向的字符串中的所有单词,按相反顺序放入 pb,同时去除多余的空格,单词之间只留一个空格.

主函数中,由用户输入不超 100 个单词,调用函数后,倒序输出。

测试说明

平台会对你编写的代码进行测试:

测试输入: Whatever worth well uitility use ; 预期输出: use uitility well worth Whatever

代码 

#include <iostream>
#include <cstring>
using namespace std;
#define WORDNUM 100

void revWordorder(char *pa, char *pb);
int main()
{

    char stra[WORDNUM*20], strb[WORDNUM*20];
    cin.getline(stra,WORDNUM*20); // 输入不超过100个单词,以空格间隔
    revWordorder(stra,strb);// 逆序放入strb
    cout << strb;
    return 0;
}
//函数revWordoder: 将pa指向的字符串中的所有单词,按相反顺序放入pb,单词之间只留一个空格
//例如 pa中为 red blue, 则调用函数后,pb中为blue red
//提示:用指针数组重新组织pa,让每一个数组元素指向一个单词字符串
void revWordorder(char *pa, char *pb)
{
    //=======begin======
   pb[0]='\0';
    char *words[WORDNUM]; // 指针数组,用于存储每个单词的指针
    int wordCount = 0; // 单词计数器

    // 遍历输入字符串pa,将每个单词的指针存入指针数组words中
    char *word = strtok(pa, " "); // 使用空格作为分隔符,获取第一个单词
    while (word != nullptr) {
        words[wordCount++] = word; // 存储单词指针到数组中
        word = strtok(nullptr, " "); // 继续获取下一个单词
    }

    // 将单词逆序放入字符串pb
    for (int i = wordCount - 1; i >= 0; i--) {
        strcat(pb, words[i]); // 将当前单词追加到结果字符串pb中
        if (i > 0) {
            strcat(pb, " "); // 在单词之间添加一个空格
        }
    }


    //========end========
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值