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.hqwc.cn/news/690232.html

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

相关文章

在IDEA中使用 Spring Initializr 新建 spring boots 项目

【在IDEA中使用 Spring Initializr 新建 spring boots 项目 - CSDN Apphttp://t.csdnimg.cn/mVs5P Spring Initializr 创建spring boots项目 添加到pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec…

OpenAI 推出革命性网络搜索工具,挑战谷歌霸主地位!

OpenAI即将推出的新搜索工具标志着人工智能技术在搜索引擎领域的深入应用&#xff0c;该工具将结合自然语言处理、机器学习和大数据分析等技术&#xff0c;为用户提供个性化、精准的搜索结果&#xff0c;极大地提升了搜索体验的质量和效率&#xff0c;这对于专业领域的用户来说…

探索生产者/消费者模式:解决并发编程中的资源竞争

序言 在并发编程中&#xff0c;资源竞争是一个常见的问题。为了有效地管理资源并确保线程安全&#xff0c;需要采用一些有效的方法。其中之一是生产者/消费者模式&#xff0c;它是一种经典的并发设计模式&#xff0c;用于解决生产者和消费者之间的协作问题。本文将深入探讨生产…

外卖点餐单店+多店自由切换小程序源码系统全功能版 带完整的安装代码包以及搭建部署教程

近年来&#xff0c;外卖市场持续火爆&#xff0c;但许多餐饮商家在接入外卖平台时面临着诸多困扰。高昂的平台费用、复杂的操作流程以及数据安全隐患等问题&#xff0c;让商家们倍感压力。为了解决这些问题&#xff0c;小编给大家分享一款集单店与多店管理于一体的外卖点餐系统…

boost asio同步编程(附源码api)

首先注明&#xff0c;这里我写的都是关于tcp的通信。 通信大致流程 创建端点 创建tcp端点的api是boost::asio::ip::tcp::endpoint; 当然创建udp端点的api则是boost::asio::ip::udp::endpoint; 是一个表示 TCP/UDP 端点的类&#xff0c;在 Boost.Asio 库中用于网络编程。它通…

go-zero整合asynq实现分布式定时任务

本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 go-zero微服务入门教程&#xff08;点击进入&#xff09; 本教程主要实现go-zero整合asynq实现分布式定时任务。 本文源码&#xff1a;https://gitee.com/songfayuan/go-zero-demo &#xff08;教程源…

虚表,虚函数习题

6. 关于虚表说法正确的是&#xff08;d &#xff09; A&#xff1a;一个类只能有一张虚表 多重继承 B&#xff1a;基类中有虚函数&#xff0c;如果子类中没有重写基类的虚函数&#xff0c;此时子类与基类共用同一张虚表 即使子类重写了基类的虚函数&#xff0c;此时子类与…

KAN核心团队震撼力作!MIT华人用AI首次发现物理学全新方程 | 最新快讯

新智元报道 编辑&#xff1a;Aeneas 好困 刚刚提出了 KAN 的 MIT 物理学家 Max Tegmark 和北大校友刘子鸣&#xff0c;又有一项重磅研究问世了&#xff01;团队发现&#xff0c;它们用 AI 发现了物理学中的新方程&#xff0c;从此&#xff0c;AI 很可能被引入物理学研究领域&am…

从零自制docker-12-【overlayfs】

文章目录 overlayfsexec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()exec.Command格式差异 挂载mount卸载unmount代码地址结果演示 overlayfs 就是联合文件系统&#xff0c;将多个文件联合在一起成为一个统一的…

手机在网状态多方面重要性

手机在网状态的重要性体现在多个方面&#xff0c;它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释&#xff1a; 通信联系&#xff1a; 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

解决springboot项目的网站静态页面显示不全问题

在通过springboot搭建项目时&#xff0c;为了能够访问静态的前端页面&#xff0c;我们考虑到访问的优先级问题&#xff0c;通常选择将资源放在recourses/static的目录下&#xff0c;如下&#xff1a; 这时可能会出现类似于下面这种图片无法加载、没有按照指定位置显示的情况&am…