菜鸟记录:c语言实现PAT乙级1009--说反话

news/2025/3/22 21:51:17/文章来源:https://www.cnblogs.com/whf10000010/p/18787176

思路很简单,对于我而言,复习和新学了输入方法

题目:

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

题目分析:

本题的关键点我想是它的输入方式,在最后一段进行总结。首先很容易想到数组解决,然后以空格作为标记,倒序输出至下一个空格前的单词。

一、空格标记后输出

最简单的就是通过多个循环,先标记各个空格的位置,然后在利用这些位置倒序输出单词。这里用到fgets()输入函数,它会保留所输入的换行符,如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 char *s;
 5 int n[81];
 6 int main() {
 7     int j = 0;
 8     s = (char *)malloc (81 * sizeof(char));
 9     fgets(s, 81, stdin);  //通过fgets来输入一串具有空格和换行符的字符串
10     for (int i = 0; i < 81; i++)
11     {
12         if (s[i] == '\n') {
13             s[i] = '\0';
14             break;    //遇到换行符\n就替换成空字符\0,代表字符串的结束
15         }
16         if (s[i] == ' ') {
17             n[j++] = i;    //数组n 用来记录各个空格的位置,同时需注意记录完最后一个位置时会再加一次,也就是多记一次
18         }
19     }
20     while (j!=0&&j--)      //如果输入的字符串存在空格并且存在时输出到最后一个空格时停止倒序输出单词
21     {
22         for (int i = n[j]+1; s[i] != '\0' && s[i] != ' '; i++)
23         {
24             printf("%c", s[i]);
25         }
26         printf(" ");
27     }
28     j = 0;
29     while (s[j] != '\0' && s[j] != ' ')    //输出第一个单词
30     {
31         printf("%c", s[j++]);
32     }
33     return 0;
34 }

二、便输出便标记

上一种方法可以看到较为冗余,如果我们可以直接输出就好了。这里利用输出遇到'空字符\0'停止输出的特性,那么我们可以不用标记空格,只需要在输出时通过倒序判断是否为空格,如果是的话我们就直接输出。输出第一个单词,也就是原输入的最后一个单词,再往前读都会被空格隔开,我们可以在读到空格时将其标记为空字符即可,具体如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main() {
 4     char string[80];
 5     long i = 0;
 6     scanf("%[^\n]",string);//[^\n]可以在调用scanf函数时读到换行符停止输入,不会计入其中
 7     for(i = strlen(string); i > 0;i--){
 8         if (string[i] == ' ') {//遇到空格则输出单词并用空字符标记
 9             printf("%s ", &string[i+1]);
10             string[i] = '\0';
11         }
12     }
13     printf("%s\n", &string[i]);
14 }

三、调用string函数

同样的,通过改变对空格的标记改变,我们用到string相关函数也能达到是代码简洁的效果。

*strchr(const char *str, int c)可以返回字符串str中首次出现c的位置,这个c一般为单个字符或者具体整数,例如:

char s[]="ssvgg"
char *t=strchr(s, 'v');
printf("%s", t);    //最后输出vgg

 *strrchr(const char *str, char ch) 可以返回字符串str中最后一次出现c的位置,这个c一般为单个字符或者具体整数,例如:

char s[]="ssvsvgg"
char *t=strrchr(s, 'v');
printf("%s", t);    //最后输出vgg,而不是vsvgg

接下来,我们可以通过定位空格的位置,调用strchr来判断是否已经输出完除了第一个单词以外的所有单词,调用strrchr则通过定位空格倒序输出单词,并将其改为空字符。,具体如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     int i = 0;
 7     char s[100] = { 0 };
 8     while (i < 81) {
 9         s[i] = getchar();
10         if (s[i] == '\n') {
11             s[i] = '\0';
12             break;
13         }
14         i++;
15     }    //使用getchar()输入,不用gets是因为危险系数高
16     while (strchr(s, ' ') != NULL)    //还存在空格时就继续循环输出
17     {
18         printf("%s ", strrchr(s, ' ') + 1);    //从空格后一位输出
19         *strrchr(s, ' ') = 0;    //将返回的指针修改为0,即指向空字符\0,0为其ACII值
20     }
21     printf("%s\n", s);
22     return 0;
23 }

这里补充说明19行:假设字符串 s 的值为 “Hello World”,通过strrchr定位

s:  H e l l o   W o r l d \0 ^|strrchr(s, ' ')

经过19行的代码则有

s:  H e l l o \0 W o r l d \0^ |替换为 \0

 

关于输入函数:getchar、scanf、fgets

  1. getchar()一次只能读取一个字符。如果需要,必须使用循环读取多个字符不会跳过任何字符,包括空格、换行符等。(例如三中所使用的方法)
  2. scanf()必须提供格式化字符串 (如%d、%c、%s)用于指定期望的输入格式,使用 & 运算符获取变量的地址,以将读取的值存储到变量中会跳过任何字符,包括空格、换行符等,用[^]可以当输入遇到指定内容时停止输入,将多余内容放进缓冲区(例如二中所使用的方法)。但是注意当需要多次调用输出,特别是调用fegts时,需用清空缓冲区,否则下次输入会读取换行符。
  3. fgets()从指定的输入流中读取一行字符串。如果存在换行符则会读取在在字符串中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903618.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅说线性差分和树上差分

目录线性差分正常思路差分思路二维差分的定义二维差分的解释例题1 地毯树上差分引入点差分例题1——wwx的出玩分析与解答例题2——松鼠的新家分析与解答边差分例题1——边差分模版分析与解答例题2——运输计划分析与解答 线性差分 当我们这里有\(n\)个数,现在我要对其中一段进…

Spring 事务失效

场景1:代码:执行结果:异常抛出,但是数据没有回滚。 代理对象调用 b() 方法 没有开启事务:普通对象调用a() 方法开启事务:在b() 方法上加入事务注解,开启事务就没问题:本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18787133

征程 6X CAMSYS 性能测试方案介绍

1.性能测试方法原理 CAMSYS 其性能指标主要包括:帧率、延迟,以及系统的 DDR 带宽、CPU 占用率等。 对于帧率、延迟,通过在驱动中创建 trace event,分别记录通路上的每个 IP,每帧开始处理(frame_start)和结束处理(frame_end)的时间戳信息和帧信息,来实现帧率计算和延迟…

数据结构2

概率论与数理统计1-基本概念 概率论与数理统计2-基本数据结构 概率论与数理统计3-基本数据处理技术 基本的数据结构 - 数据结构- 数据的逻辑结构- 线性结构- 线性表- 栈(特殊的线性表)- 队列(特殊的线性表)- 字符串- 数组- 广义表- 非线性结构- 树型结构- 图型结构- 数据的存储…

day7 刷牛客华为机试题+学java

https://www.nowcoder.com/exam/oj/ta?page=1&tpId=37&type=37 字符串 第一题:第二题: 省行版:逻辑版:java网课学习: 多态调用成员变量,编译看左边,运行也看左边。调用成员方法时,编译看左边,运行看右边。if(a instanceof Dog d) 导包final 修饰引用类型地址…

【Docker】MySQL、Reids、Mongodb、Nacos、RabitMQ安装指南

1 docker的下载 建议通过 火绒应用商店 或者 联想应用商店 下载 2 配置Docker 配置镜像站 https://docker.1panel.live {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": fa…

Web前端入门第 22 问:CSS 选择器一览

HTML 在语法上并无大小限制,所以其结构可以浩瀚无边,CSS 选择器的作用则是在这些复杂的 HTML 结构中进行元素定位。 示例代码 记住此代码,后面所有的 css 选择器都是基于此代码。 注意:代码中存在两个一样的 id="p1" 元素,仅为了演示效果,正常编码中请保证 id …

曼哈顿距离和切比雪夫距离

曼哈顿距离(Manhattan Distance) 解释:只能横着或竖着走,坐标上两点的距离 假设存在两点 \(A(x_1, y_1)\) \(B(x_2, y_2)\) \(dis(A, B) = |x_1 - x_2| + |y_1 - y_2|\)对于上方求曼哈顿距离的式子,有四种情况 \( \begin{cases} x_1 > x_2 & y_1 > y_2 & {…

如何设置家用威联通 NAS UPS 断电后自动关机并通知其他设备?

场景📝备注: 求轻喷, 求放过. 😅 我真的是个理线方面的白痴. 这已经是我的极限了. 😂我的家庭实验室 Homelab 服务器集群配置如下.上半部分之前已经介绍过了, 这里就不再赘述了. 今天重点介绍介绍 UPS 和 NAS 部分.1台 UPS, 型号为 APC Back-UPS 650. 插座插着: NAS 和 插…

[扫描线] 数据结构测试(2025.3.22)

暴力大赛,赛时暴力打满喜提80pts,可惜T1没想到暴力。 难度:T2<T1<T3.T1 第1题 团队 查看测评数据信息有n个工人,第i个工人的能力是v[i], 他只与能力在L[i]到R[i]之间的人在一起工作,问最多能选出多少人在一起工作。输入格式第一行,一个整数n, 1 <= n <…

centOS 上部署hadoop+mysql+hive 服务之hadoop安装

以下安装的hadoop版本是3.3.6 ,由于hadoop是运行于java环境,因此,需要提前安装java jdk并配置环境变量。 jdk的安装及配置: jdk8 国内下载路径:https://repo.huaweicloud.com/java/jdk/8u202-b08/ 可根据实际需要选择对应的jdk版本 1、下载jdkwget https://repo.huaweicl…

创建django视图和路由

第一个视图 from django.shortcuts import render from django.http import HttpResponse# Create your views here. def hello(request):msg = Hello World!!!return HttpResponse(msg)第一个路由 from django.urls import path from .views import hellourlpatterns = [path(…