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函数,别忘了带走它留下的那片云彩。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【matlab基础知识代码】(十八)无约束最优化问题

min下面的x称为优化向量或者是决策变量 匿名函数法 >> f(x)(x(1)^2-2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2)); x0[0; 0]; [x,b,c,d]fminsearch(f,x0), x 0.6111 -0.3056 b -0.6414 c 1 d 包含以下字段的 struct: iterations: 72 funcCount: 137 algor…

Hive SQL-DML-insert插入数据

Hive SQL-DML-insert插入数据 1. 插入静态数据 可以直接插入具体的值到Hive表中&#xff1a; INSERT INTO TABLE tablename (column1, column2, column3) VALUES (value1, value2, value3),(value4, value5, value6),...;2. 插入查询结果 将一条查询的结果直接插入到另一个表中…

软件工程基础知识,软考选择题的重点

本篇知识来自&#xff1a;软件设计师考试同步辅导 ---考点。。。。。&#xff0c;钟彩华 博伟玉 清华出版社&#xff0c;那本书。仅供学习。以下理解都是本人自己认为的。仅供参考。 本书的第132页&#xff0c;第五章知识。 目录 软件工程叙述 软件的生命周期 软件过程 软…

android studio配置Http Proxy

1、问题描述&#xff1a; Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request” 解决&#xff1a;HTTP Proxy设置 1.File→Settings…→System Settings → HTTP Proxy → Auto-detect proxy settings”&#xff1b; 2.勾选下方“Automatic prox…

Codigger:Vim的革新者,提升开发体验和功能性

深知Vim在编程和文本编辑领域的卓越地位&#xff0c;因此&#xff0c;在设计和开发过程中&#xff0c;Codigger始终将保留Vim的核心功能和高度定制能力作为首要任务。然而&#xff0c;Vim的复杂性和高度定制性也让很多新用户望而却步。为了降低这种使用门槛&#xff0c;Codigge…

常用Linux命令详细总结

一、文档编辑、过滤、查看命令 1、cp 复制文件和目录 -a 复制文件并保持文件属性 -d 若源文件为链接文件&#xff0c;则复制链接文件属性而非文件本身 -i 覆盖文件前提示&#xff0c;如果不要提示&#xff0c;在命令前加上\ -r 递归复制&#xff0c;通常用于目录的复制 …

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况&#xff1f;2. 解决方案方法一&#xff1a;使用 fuser 命令方法二&#xff1a; 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时&#xff0c;我们有时会发现虽然没有可见的进程在执行&#xff0c;但GPU资源却意外地被占用。这种情况往往会阻碍…

揭秘LLMOps,高效开发大型语言模型

大家好&#xff0c;随着人工智能&#xff08;AI&#xff09;的蓬勃发展&#xff0c;一个新兴领域语言模型运维&#xff08;LLMOps&#xff09;正逐渐成为关注的焦点。LLMOps专注于对大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;进行全…

ESP32重要库示例详解(一):EEPROM之Preferences库

1. 了解EEPROM 在嵌入式系统开发中&#xff0c;断电后晚能存储少量数据是常见需求。EEPROM&#xff08;Electrically Erasable Programmable Read-Only Memory&#xff09;是一种非易失性存储器&#xff0c;即使断电数据也不会丢失。ESP32的EEPROM模拟功能利用闪存空间&#x…

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…

时间范围交集查询

业务场景&#xff1a; 数据库中时开始时间与结束时间&#xff0c;筛选数据条件将这两个字段&#xff08;开始时间、结束时间&#xff09;糅合成一个字段&#xff0c;并且是范围筛选。 数据库字段&#xff1a; 筛选条件&#xff1a; 数据分析 全部包含&#xff08;子集&#…

WorkPlus im(即时通讯)集成平台助力政企数字化转型升级

随着互联网技术的不断发展&#xff0c;企业内部通讯软件已经成为企业日常运营中不可或缺的一部分。企业IM&#xff08;即时通讯&#xff09;和移动门户作为企业内部通讯软件的关键组成部分&#xff0c;为企业提供更加高效、便捷的通讯方式&#xff0c;提高了企业的运营效率。 针…

共绘财富管理新蓝图,ATFX赞助出席拉美峰会,引领家族资本新航向

全球新兴市场中&#xff0c;拉丁美洲以其非凡活力与潜力格外引人注目&#xff0c;成为全球资本竞相追逐的价值洼地。ATFX自2019年开设墨西哥办事处以来&#xff0c;持续深耕拉美市场已成为头部品牌。自4月行业资深人士Ergin Erdemir掌舵拉美业务后&#xff0c;掀起市场营销新浪…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …

选型前必看,西门子五大系列PLC的区别及特点

西门子是全球知名的自动化解决方案提供商&#xff0c;其PLC&#xff08;可编程逻辑控制器&#xff09;系列产品广泛应用于工业控制领域。不同系列的PLC在功能、性能和适用范围上有所区别。本文将详细介绍西门子PLC各个系列的特点和区别&#xff0c;以及在实践应用时如何采用无线…

用vsCode开发uni-app(vue + ts)项目流程

提示:记录项目创建流程 文章目录 前言一、安装 uni-app 插件二、ts 类型校验1.安装类型声明文件2.配置 tsconfig,json三、json 注释问题四、组件引入1. 安装 uni-app2. 组件自动引入3. 配置 ts 类型五、小程序端 Pinia 持久化六、uni.request 请求封装七、请求成功提取数据和设…

内容付费小程序功能源码系统 带完整的安装代码包以及搭建部署教程

随着互联网技术的不断进步&#xff0c;内容创作和传播方式发生了翻天覆地的变化。用户对于高质量、有价值的内容需求日益增长&#xff0c;而内容创作者也希望通过自己的专业知识、经验分享等方式获取经济回报。然而&#xff0c;传统的内容分发方式存在诸多局限性&#xff0c;如…

使用map类型的参数在mapper.xml中使用案例

使用map类型的参数在mapper.xml中使用案例 简介&#xff1a;在常见的开发中&#xff0c;对于参数的装载一般使用map类型方式&#xff0c;这样可以避免创建很多参数实体类&#xff0c;不管嵌套多层的数据参数都可以通过map拿取&#xff0c;对于嵌套多层的map&#xff0c;我们需…

事件代理 浅谈

事件代理是一种将事件处理委托给父元素或祖先元素来管理的技术。当子元素触发特定事件时&#xff0c;该事件不会直接在子元素上进行处理&#xff0c;而是会冒泡到父元素或祖先元素&#xff0c;并在那里进行处理。这样做的好处是可以减少事件处理函数的数量&#xff0c;提高性能…

Centos 7.9 安装 tigervnc-server

环境&#xff1a;当前使用的 Centos 7.9 的光盘作为的本地源。 1 检查是否已安装 tigervnc [rootlocalhost /]# rpm -q tigervnc tigervnc-server 未安装软件包 tigervnc tigervnc-server-1.8.0-21.el7.x86_64 如果安装过卸掉 卸载: rpm -e [rootlocalhost /]# rpm -e tige…