题目
任务描述
本关任务:请实现函数
revWordoder
,能够将pa
指向的单词表字符串中的所有单词,按相反顺序放入pb
,同时去除多余的空格,单词之间只留一个空格.例如
pa
中为red blue
, 则调用函数后,pb
中为blue red
。主函数中,由用户输入不超 100 个单词,调用函数后,倒序输出。
相关知识
为了提高程序的通用性和可维护性,代码中用常量表示单词个数。
#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========
}