描述
对字符串中的所有单词进行倒排。
说明:
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
题解:
我们用一个指针数组来存放每个单词的首地址,然后用一个while循环到这个单词的末尾,遇到非构成单词的字符,将非构成单词的字符变为'\0',最后根据每个单词的首地址,逆序打印每个单词。
代码如下:
#include <stdio.h>
#include <string.h>
int main() {
char str[10000];
//多组输入
while (fgets(str, sizeof(str), stdin) != NULL) {
char* word[1000] = { NULL };
int row = 0;
char* ptr = str;
while (*ptr != '\0') {
if ((*ptr >= 'A' && *ptr <= 'Z') || (*ptr >= 'a' && *ptr <= 'z')) {
//将单词的首地址存入指针数组
word[row++] = ptr;
//把本次的单词字母字符走完,直到遇到非字母字符
while (*ptr != '\0' && (*ptr >= 'A' && *ptr <= 'Z') || (*ptr >= 'a' && *ptr <= 'z')) {
ptr++;
}
//当*ptr = '\0'时,表示此次输入的英文句子已经结束,防止ptr+1后越界
continue;
}
*ptr = '\0';
ptr++;
}
//逆序打印单词
for (int i = row - 1; i >= 0; i--) {
//打印一个单词的原理为给printf一个起始地址直到遇到'\0'
printf("%s ", word[i]);
}
printf("\n");
}
return 0;
}
运行结果:
逻辑如下图所示:
完