【C++】B2109 统计数字字符个数

news2025/1/7 20:39:45

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述与输入输出要求
    • 题目:统计数字字符个数
    • 样例输入输出
  • 💯方法分析与代码实现
    • 方法 1:使用 `fgets` 读取输入并手动判断数字字符
      • 代码实现
      • 分析与优点
      • 缺点与优化方向
    • 方法 2:使用 `scanf` 格式化输入并手动判断数字字符
      • 代码实现
      • 分析与优点
      • 缺点与优化方向
    • 方法 3:引入 `isdigit` 函数简化判断逻辑
      • 代码实现
      • 分析与优点
    • 实现与优化建议
      • 改进版 1:去除换行符并使用现代 C++
      • 分析与优点
  • 💯拓展讨论
  • 💯总结


在这里插入图片描述


💯前言

  • 在学习编程的过程中,常常会遇到诸如"统计数字字符个数"这样的问题。看似简单,但通过不同方法实现,可以让我们深入理解输入输出的处理、字符判断的技巧以及代码优化的可能性。在本文中,我们围绕一个具体的题目展开,从题目分析开始,依次解读老师的几种实现方法以及我的实践方法,进行详细的思路对比,并提出进一步优化方案及拓展讨论。
    通过这篇文章,读者将不仅学会如何解决数字字符统计问题,还能理解背后的代码设计和优化思路,从而提高自身编程能力。
    C++ 参考手册
    在这里插入图片描述

💯题目描述与输入输出要求

B2109 统计数字字符个数
在这里插入图片描述

题目要求如下:

题目:统计数字字符个数

  • 描述:输入一行字符串,统计出其中数字字符的个数。
  • 输入格式:
    • 一行字符串,总长度不超过 255。
  • 输出格式:
    • 输出为 1 行,表示字符串中数字字符的个数。

样例输入输出

输入样例 #1:

Today is 2021-03-27

输出样例 #1:

8

输入样例 #2:

hello123world456

输出样例 #2:

6

💯方法分析与代码实现

方法 1:使用 fgets 读取输入并手动判断数字字符

代码实现

#include <iostream>
#include <cstring>
using namespace std;

const int N = 266;
char arr[N];

int main()
{
    // 使用 fgets 读取带空格的字符串,并自动在末尾加上字符串结束符 \0
    fgets(arr, N, stdin);

    int i = 0;
    int c = 0;

    // 遍历字符串,直到遇到换行符 '\n'
    while (arr[i] != '\n')
    {
        if (arr[i] >= '0' && arr[i] <= '9') // 判断是否是数字字符
            c++; // 数字字符计数
        i++;
    }

    cout << c << endl;
    return 0;
}

在这里插入图片描述

分析与优点

  1. 输入方式:

    • 使用 fgets 安全读取整行字符串,可以处理带有空格的输入。
    • 自动在字符串末尾加上结束符 \0,无需手动添加。
  2. 逻辑清晰:

    • 使用 while 遍历字符数组,条件判断为 arr[i] != '\n',明确以换行符为终止标志。
    • 手动通过 if 判断字符是否在 '0''9' 范围内,简单直接。
  3. 适用场景:

    • 适用于需要逐字符处理的简单任务。

缺点与优化方向

  1. 多余的换行符处理:

    • 使用 fgets 会将换行符也作为输入的一部分,需手动判断并跳过。
    • 可在读取完成后用以下方式去除换行符:
      int len = strlen(arr);
      if (arr[len - 1] == '\n') arr[len - 1] = '\0';
      
  2. 代码略显繁琐:

    • 手动比较字符 ASCII 值,虽然简单,但冗长且容易出错。

方法 2:使用 scanf 格式化输入并手动判断数字字符

代码实现

#include <iostream>
#include <cstring>
using namespace std;

const int N = 266;
char arr[N];

int main()
{
    // 使用 scanf 读取一行输入,遇到换行符 \n 停止,不会将 \n 存入 arr
    scanf("%[^\n]", arr);

    int i = 0;
    int c = 0;

    // 遍历字符串,直到遇到字符串结束符 '\0'
    while (arr[i] != '\0')
    {
        if (arr[i] >= '0' && arr[i] <= '9')
            c++;
        i++;
    }

    cout << c << endl;
    return 0;
}

在这里插入图片描述

分析与优点

  1. 输入方式更简洁:

    • 使用 scanf 和格式控制符 %[^ ],读取整行字符串,遇到换行符停止,避免了换行符的干扰。
  2. 逻辑清晰:

    • 遍历条件为 arr[i] != '\0',标准的 C 风格字符串操作。
  3. 适用场景:

    • 更适合只需要简单输入处理的场景。

缺点与优化方向

  1. 潜在的数组越界问题:
    • 如果输入字符串长度超过 266 字符,会导致数组越界。
    • 优化:为输入限制最大长度,例如:
      scanf("%265[^
      

]", arr);
```

  1. 仍需手动比较字符范围:
    • 判断逻辑仍然是 arr[i] >= '0' && arr[i] <= '9',可读性不够高。

方法 3:引入 isdigit 函数简化判断逻辑

代码实现

#include <iostream>
#include <cctype> // 引入 cctype 以使用 isdigit 函数
using namespace std;

const int N = 266;
char arr[N];

int main()
{
    scanf("%[^
]", arr);

    int i = 0;
    int c = 0;

    while (arr[i] != '\0')
    {
        if (isdigit(arr[i])) // 使用 isdigit 判断是否是数字字符
            c++;
        i++;
    }

    cout << c << endl;
    return 0;
}

在这里插入图片描述

分析与优点

  1. 逻辑更简洁:

    • 使用 isdigit 函数代替手动比较字符范围,提升代码可读性,减少出错可能性。
    • isdigit 是标准库函数,专门用于判断字符是否为数字字符。
  2. 适用性强:

    • 适用于各种字符判断任务,扩展性更好。
  3. 代码优化方向:

    • 保持输入安全性,限制输入最大长度:
      scanf("%265[^
      

]", arr);
```


实现与优化建议

改进版 1:去除换行符并使用现代 C++

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()
{
    string input;
    getline(cin, input); // 使用 getline 读取整行输入

    int count = 0;
    for (char ch : input)
    {
        if (isdigit(ch))
            count++;
    }

    cout << count << endl;
    return 0;
}

在这里插入图片描述

分析与优点

  1. 使用 getline 替代字符数组:

    • 避免了数组越界问题,更加安全。
  2. 更现代化的风格:

    • 使用 C++ 的字符串类 std::string,更符合现代 C++ 编程习惯。
  3. 代码简洁易读:

    • 利用范围循环和 isdigit,避免手动索引操作。

💯拓展讨论

  1. 如何统计其他字符类型?

    • 可以扩展判断逻辑,使用 isalpha 判断字母字符,isspace 判断空白字符等。
  2. 性能优化:

    • 对于较大的输入,可考虑分块处理,减少内存占用。
  3. 输入校验:

    • 如果输入格式不确定,应添加输入校验逻辑,确保输入合法性。

💯总结

通过本文的分析,我们从多种方法解决了"统计数字字符个数"的问题。每种方法都有其适用场景与优缺点,其中使用 isdigit 和现代 C++ 的实现更具优势。在实际开发中,选择适合问题需求的方法并进行优化,能更高效地解决问题,同时提升代码的可读性与维护性。

希望本文能帮助读者深入理解字符处理的思路与技巧,进一步提升编程能力!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心&#xff0c;设计一款智能远程家电控制系统&#xff0c;该系统能实现如下功能&#xff1a; 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关&#xff1b; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…

git理解记录

文章目录 1. 背景2. 基本概念3. 日常工作流程4. 其他常见操作4.1 merge合并操作4.2 tag打标签操作4.3 remoute远程操作4.4 撤销修改 git理解记录 1. 背景 git作为分布式版本控制系统&#xff0c;开源且免费&#xff0c;相比svn集中式版本控制系统存在速度快(HEAD指针指向某次co…

开启宝塔Nginx防火墙支付返回失败解决方法

1.把/plugin.php加到Nginx防火墙URL白名单 包括支付服务器回调ip 2.如果支持带参数 /plugin.php?idzhifufm:notify 加到Nginx防火墙标准模式-URL白名单带参数 如果上面都不行 就把下面的IP加入白名单 39.107.193.172 47.94.194.103 47.104.216.190

平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网

为响应金融知识普及教育号召&#xff0c;平安产险安徽分公司联动安徽中医药临床研究中心附属医院&#xff0c;于近日在朝霞小学举办了一场儿童安全防范与健康守护活动。此次活动旨在提升学生的安全防范意识&#xff0c;守护儿童健康成长&#xff0c;同时有力推动金融知识与传统…

Elasticsearch:Lucene 2024 年回顾

作者&#xff1a;来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中&#xff0c;我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色&#xff0c;发布了许多版本&#xff0c;包括三年来的首次重大更新&#xff0c;其中包含令人兴奋…

Unity打包问题集(持续更新)

1.报错&#xff1a;CommandWithNoStdoutInvokationFailure: Unable to start ADB server. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details. 大致意思就是打不开ADB的服务器&#xff0c;请检查安卓…

SpringBoot环境和Maven配置

SpringBoot环境和Maven配置 1. 环境准备2. Maven2.1 什么是Maven2.2 为什么要学 Maven2.3 创建一个 Maven项目2.4 Maven核心功能2.4.1 项目构建2.4.2 依赖管理2.4.3 Maven Help插件 2.5 Maven 仓库2.5.1本地仓库2.5.2 中央仓库2.5.3 私有服务器, 也称为私服 2.6 Maven设置国内源…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

NLP项目实战——基于Bert模型的多情感评论分类(附数据集和源码)

在当今数字化的时代&#xff0c;分析用户评论中的情感倾向对于了解产品、服务的口碑等方面有着重要意义。而基于强大的预训练语言模型如 Bert 来进行评论情感分析&#xff0c;能够取得较好的效果。 在本次项目中&#xff0c;我们将展示如何利用 Python 语言结合transformers库&…

各种数据库类型介绍

1.关系型数据库&#xff08;Relational Databases, RDBMS&#xff09; 关系型数据库是基于关系模型组织的数据库&#xff0c;其数据结构以表格的形式存在&#xff0c;表格之间通过外键等关系相互关联。它们支持复杂的SQL&#xff08;Structured Query Language&#xff09;查询…

创龙3588——debian根文件系统制作

文章目录 build.sh debian 执行流程build.sh源码流程 30-rootfs.sh源码流程 mk-rootfs-bullseys.sh源码流程 mk-sysroot.sh源码流程 mk-image.sh源码流程 post-build.sh 大致流程系统制作步骤 build.sh debian 执行流程 build.sh 源码 run_hooks() {DIR"$1"shiftf…

倾斜摄影相机在不动产确权登记和权籍调查中的应用

一、项目背景 1.1 项目背景 为贯彻落实中央、国务院关于实施乡村振兴战略、关于“扎实推进房地一体的农村集体建设用地和宅基地使用权确权登记颁证&#xff0c;完善农民闲置宅基地和闲置农房政策&#xff0c;探索宅基地所有权、资格权、使用权‘三权分置’”的要求&#xff0…

在K8S上部署OceanBase的最佳实践

在K8S上部署OceanBase的最佳实践 目录 1. 背景与选型 1.1 为什么选择OB1.2 为什么选择ob-operator实现OB on K8S 2. 部署实操 2.1 环境准备2.2 安装 ob-operator2.3 配置 OB 集群2.4 配置 OBProxy 集群2.5 Headless Service 和 CoreDNS 配置2.6 监控与运维 2.6.1 Promethues部…

【设计模式-1】软件设计模式概述

1. 软件设计模式的产生背景 “设计模式”这个术语最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977 年&#xff0c;美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexander&#xff09;在…

Nginx——反向代理(三/五)

目录 1.Nginx 反向代理1.1.Nginx 反向代理概述1.2.Nginx 反向代理的配置语法1.2.1.proxy_pass1.2.2.proxy_set_header1.2.3.proxy_redirect 1.3.Nginx 反向代理实战1.4.Nginx 的安全控制1.4.1.如何使用 SSL 对流量进行加密1.4.2.Nginx 添加 SSL 的支持1.4.3.Nginx 的 SSL 相关指…

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb;   libtorch库是一个用于深度学习的C库&#xff0c;是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具&#xff0c;用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序求图的最小生成树。 相关知识 为了完成…

11.认识异常

本节目标 1.异常概念与体系结构 2.异常的处理方式 3.异常的处理流程 4.自定义异常类 1.异常的概念与体系结构 1.1异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常,比如: 1.算术异常 System.out.println(10/0);//执行结果 Exception in thread "mai…