龙空技术网

用C语言实现“说反话-加强版”,基础编程由此开始(第二十九节)

小萌九尾 190

前言:

此刻咱们对“c语言字符串颠倒”大体比较着重,兄弟们都想要学习一些“c语言字符串颠倒”的相关内容。那么小编在网上汇集了一些对于“c语言字符串颠倒””的相关文章,希望看官们能喜欢,咱们一起来了解一下吧!

今天这道题目呢,是我们之前在PAT乙级中遇到的“说反话”题目的进阶版本,当然,标题里也说得很清楚了,这道题就是“说反话-加强版”。

我们先来看看该题的具体要求:

1、给定一句英语,要求将句中所有单词的顺序颠倒打印输出。

2、该字符串长度不超过500000,字符串由若干空格和单词组成,其中单词是由英文单词(大小写有区分)组成的字符串,单词之间用若干个空格分开。

3、打印输出的结果,保证每个单词之间只有一个空格。

梳理逻辑

编程题最最重要的就是逻辑,这道题与之前的“说反话”的差别就在于,一方面是对字符串的长度有了一定的要求,另一方面是遇到多个空格时,要把多个空格给省略,在结果打印方面只有一个空格。

1、输入一个字符串,且长度不超过500000,所以要用到字符数组来存储该字符串,且数组内存储的数字为500001,因为数组下标是从0开始的,用scanf函数来进行输入。

2、将输入的英语句子颠倒顺序后输出,那么就需要进行一次倒序遍历,此时倒序遍历最终的值是无法把数组下标为0的数给打印出来,所以我们需要把数组下标为0的数,也就是第一个英语单词给单独存储起来。

同时也是为了防止输入的是空格时,打印导致报错。

而至于如何把中间多余的空格给去掉,我们就需要用到一个计数法了。

以测试用例为例,遇到单词时,我们开始计数,然后遇到空格时,且计数大于0,也就是没有连续的空格时,那么就要跳过空格,打印下一个单词。

如果是整句字符串只有空格的情况下,那就要直接结束打印了。

代码实现

//说反话-加强版#include<stdio.h>#include<string.h>int main() {    char string[500001];//长度要不超过500000,数组下标从0开始    long i = 0;    int count = 0;//进行一个计数法来打印空格    scanf("%[^\n]",string);//输入字符串    for(i = strlen(string); i >= 0;i--){        if (string[i] == ' '&&count>0) {//遇到空格,也就是空出来的,但是没有连续的空格            printf("%s", &string[i+1]);            if(string[0]!=' '){//第一个字符串不为空                printf(" ");            }            string[i] = '\0';            count = 0;        }        else if (string[i] == ' '){//只有空格的状态            string[i] = '\0';        }        else if(string[i]!=' '&&string[i]!='\0'){//没有空格且没有结束            count++;        }    }    printf("%s", &string[0]);//打印最开始的字符串}
结果测试总结

对于这道题目而言,其实还是有些难度的,我虽然考虑到了计数法,但在实际完成这道题目的时候,梳理这个计数法的逻辑花了不少时间,需要好好反思了。

标签: #c语言字符串颠倒