scanf留下的那一片云彩

【题目描述】

给出一个由O和X组成的串(长度为1~80),统计得分。每个O的得分为目前连续出现的O的个数,X的得分为0。例如,OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3。

输入第一行表示有n个字符串,后续是n行字符串。

【样例输入】

5

OOXXOXXOOO

OOXXOOXXOO

OXOXOXOXOXOXOX

OOOOOOOOOO

OOOOXOOOOXOOOOX

【样例输出】

10

9

7

55

30

【题目来源】

刘汝佳《算法竞赛入门经典  第2版》习题3-1 得分(Score, ACM/ICPC Seoul 2005, UVa1585)

【解析】

本题是一道得分累加问题,题目不难,只需定义两个变量:

①计数器cnt,用于计算已经连续出现的“O”的个数;

②累加器sum,用于计算串的得分。

思路就是对输入串的字符进行遍历,如果遇到“O”就cnt++,如果遇到“X”就将cnt重置为0,然后每次将cnt加到sum中即可。

1.用scanf输入字符串

#include<stdio.h>
char s[85];
int main(){int n;char c;scanf("%d", &n);while(n--){int sum=0, cnt=0;scanf("%s", s);for(int i=0; i<strlen(s); i++){if('O'==s[i]) cnt++;else cnt=0;sum += cnt;}printf("%d\n", sum);}return 0;
}

代码说明:

1.代码精简。for循环中的代码可以进一步精简,就是将cnt的自加与sum的累加合成一个语句,改后代码如下:

if('O'==s[i]) sum += ++cnt;

else cnt=0;

注意,因为要返回自加后的值,此时就需要用++cnt,不能用cnt++(关于二者的区别参见“找不到北的i++”一文https://blog.csdn.net/jjmhx/article/details/136995419)。

2.效率问题。你是否发现,代码中有一处写法效率低下。就是在“程序找茬:统计字符个数问题”一文中提到的“重复调用函数”问题,strlen函数放在for循环中会导致重复计算字符串的长度。解决方法就是预先将函数的值赋给一个变量,在for循环中直接用这个变量。

3.头文件缺失。在“程序找茬:统计字符个数问题”一文中已提到,不引用<string.h>头文件程序也能执行(只是会有警告),但是在Online Judge - Home网站中提交代码反馈错误。

如果因为这个问题丢分实属不值,所以还是乖乖加上该加的头文件吧。

2.用getchar输入字符

老金想着秀一下“编技”,打一开始就想用getchar读取字符,这样就用不着数组了,没想到输出了意想不到的结果。

最开始编的代码是只是针对一个字符串的情况,运行没有任何问题。代码如下:

#include<stdio.h>
int main(){char c;int sum=0, cnt=0;while((c=getchar())!='\n'){if('O'==c) cnt++;else cnt=0;sum += cnt;}printf("%d\n", sum);return 0;
}

没想到改成多组字符串时出现了问题,代码如下:

#include<stdio.h>
int main(){int n;char c;scanf("%d", &n);while(n--){int sum=0, cnt=0;while((c=getchar())!='\n'){if('O'==c) cnt++;else cnt=0;sum += cnt;}printf("%d\n", sum);}return 0;
}

运行结果:

居然刚输入数字5就直接输出了结果!什么情况?

经过调试老金搞明白了原因,问题出在了输入缓冲区。

执行到scanf("%d", &n)这条语句时,实际在键盘输入的是两个字符:一个是’5’,一是个换行符’\n’。 scanf函数只是读取了字符“5”,并没有读入换行符。所以这条语句执行完后,换行符还留在输入缓冲区。因此,getchar第一次读取的是换行符,循环条件不满足,直接输出sum的初始值0。

搞清原因,解决起来就好办了,在while((c=getchar())!='\n')前加一条语句把换行符读取掉就可以了。增加代码如下:

getchar(); //清空缓冲区的换行符

所以,在使用getchar()时要注意,如果前面使用了scanf函数,别忘了带走它留下的那片云彩。

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

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

相关文章

自然资源-城镇开发边界内详细规划编制技术指南解读

自然资源-城镇开发边界内详细规划编制技术指南解读

Xilinx 千兆以太网TEMAC IP核 AXI4-Lite接口信号

在AX4总线标准中&#xff0c;AXI4-Lite主要由向她址映射型通信。TEMAC的管理法口采用AXI4-Lite标准接口&#xff0c;TEMAC核的AX14-Lite接口信号如表1所示&#xff0c;根据AX14-Lite标准&#xff0c;接口角色分为主接口(Maser Interface)和从接口(Slave Interface)。主接口为通…

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数(2007-2021年)

01、数据介绍 乡村旅游也是促进乡村经济发展的有效途径。通过发展乡村旅游&#xff0c;可以带动乡村相关产业的发展&#xff0c;提高乡村居民的收入&#xff0c;促进乡村的经济发展和社会进步。此外&#xff0c;乡村旅游还能促进城乡交流&#xff0c;推动城乡统筹发展。 数据…

如何判断自己是不是依赖性人格障碍?

什么是依赖性人格障碍&#xff1f; 依赖性人格障碍&#xff0c;其主要特征就是“依赖”&#xff0c;但是这种依赖并非普通意义上的依赖&#xff0c;构成人格障碍的依赖性&#xff0c;指的是严重影响日常生活&#xff0c;甚至是脱离了依赖关系就无法独立生存的依赖。 依赖是一…

【自动驾驶|毫米波雷达】非相参积累与恒虚警率检测

目录 非相参积累&#xff08;Non-coherent combing&#xff09; 1. 非相参积累是什么? 2. 为什么要进行非相参积累&#xff1f; 3. 如何实现非相参积累&#xff1f; 恒虚警率检测&#xff08;CFAR&#xff1a;Constant False Alarm Rate&#xff09; 1.CFAR概念引入 2. C…

几个Python处理Excel实际应用

下面介绍四个不同类型的Python处理Excel的经典应用案例&#xff0c;以帮助读者更好地掌握Python处理Excel的技能。 一、读取Excel数据 Python通过pandas库可以轻松地读取Excel数据。pandas库是一个专门用于数据分析和处理的库&#xff0c;它可以将Excel中的数据读取为DataFra…

【CTF MISC】XCTF GFSJ0513 pdf Writeup(PDF隐写)

pdf 菜猫给了菜狗一张图&#xff0c;说图下面什么都没有 解法 打开 pdf&#xff0c;只看见一张图片。 用浏览器搜索 flag&#xff0c;发现图片中间藏了一行字。 复制出来&#xff0c;得到 flag。 Flag flag{security_through_obscurity}声明 本博客上发布的所有关于网络攻…

vivado Kintex-7 配置存储器器件

Kintex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Kintex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 2.Flume基础架构…

用websocket实现一个简单的im聊天功能

WebSocket前后端建立以及使用-CSDN博客 经过我上一篇的基本理解websocket的建立以及使用后&#xff0c;这篇就写一个简单的demo 实现im聊天 首先就是后端代码&#xff0c;详细解释我都放到了每一句的代码解析了&#xff0c;文章最后我会说怎么运行流程 放置后端代码 packa…

xilinx xdma drive 传输8MB以上数据受限的问题

当传输超过8 MB数据时报错error code1359&#xff0c; #define XDMA_MAX_TRANSFER_SIZE (8UL * 1024UL * 1024UL) 可以修改成&#xff1a; #define XDMA_MAX_TRANSFER_SIZE (80UL * 1024UL * 1024UL) VS2019 WDK环境的搭建 先准备好VS WDK的驱动开发环境。需要下载VS、SD…

大数据交通行政执法监测系统

交通行政执法监测系统应用系统按照监测主体可分为&#xff1a;出租车交通违法监测&#xff0c;客车交通违法监测&#xff0c;货车、危化品车辆交通违法监测&#xff0c;非法营运车辆监测。功能模块涵盖&#xff1a;特征识别、档案查询、预警分析等。 &#xff08;1&#xff09;…

[算法][单调栈] [leetcode]316. 去除重复字母

去除重复字母 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的 字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 字典序最小&#xff1a; 考虑字符串 a 与 字符串 b&#xff0c;如果字…

MAVEN打包JAR启动执行manifest

当您使用Maven进行项目打包&#xff0c;特别是需要创建一个可执行的JAR文件时&#xff0c;确保JAR文件的MANIFEST.MF中包含正确的Main-Class属性是非常重要的。这个属性告诉Java运行时环境哪个类包含main方法&#xff0c;作为应用程序的入口点。 如果您发现生成的JAR文件不包含…

避免死锁陷阱:加锁策略的优化与最佳实践解析

1. 加锁方式优化的动机和背景 在并发编程中&#xff0c;锁是维护共享资源状态一致性的重要机制。随着业务流量的日益增长&#xff0c;原有的加锁方式可能会成为性能瓶颈。因此&#xff0c;了解和优化加锁方式是提升系统并发性能的关键步骤。 1.1. 对加锁方式进行优化的重要性…

自媒体探索2

说说大家做自媒体的一些难点。 1、需要时间来沉淀&#xff0c;你可以上班之外做自媒体。 2、一些技能的缺失。如果你不会拍摄不会剪辑&#xff0c;你就去学习&#xff0c;现在B站或者各大平台&#xff0c;都有很多的课程&#xff0c;免费的先学起。谨防被割韭菜。 3、以前觉…

服务器白名单

服务器白名单是一种安全措施&#xff0c;用于限制谁可以访问服务器资源。它定义了一组被允许访问或执行特定操作的IP地址、用户或设备。通过仅允许这些已验证和信任的实体进行连接&#xff0c;白名单可以有效地提高服务器的安全性和控制。 白名单的应用场景包括&#xff1a; 网…

光栅化渲染的光照参数

在基于光栅化的渲染中&#xff0c;光照通常是通过一些简化的参数来模拟的&#xff0c;这些参数包括&#xff1a; 环境光&#xff08;Ambient Light&#xff09;&#xff1a;环境光是来自场景中所有方向的均匀光&#xff0c;它模拟了间接光照的效果&#xff0c;使得整个场景看起…