【C++】深入理解C语言中的特殊字符处理与问题分析优化


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目:B2090 年龄与疾病
    • 输入格式
    • 输出格式
    • 输入输出样例
  • 💯初始代码分析与问题排查
    • 问题点分析
  • 💯修正后的代码与优化
    • 修正与优化要点
  • 💯拓展:`printf` 中的特殊字符处理
    • 1. 百分号 `%`
    • 2. 反斜杠 `\`
    • 3. 双引号 `"`
    • 4. 常见转义字符
  • 💯总结


在这里插入图片描述


💯前言

  • 在C语言编程过程中,格式化输出函数printf是一个高频使用的工具。然而,由于其支持格式化字符串,某些特殊字符(如%)的输出和处理经常导致困惑。本文通过具体问题的剖析,包括在洛谷平台的编程题目和相关代码的优化实践,系统地讲解了printf中特殊字符处理的机制、常见错误的排查方法,以及代码优化的技巧。希望通过这一篇文章,读者能对C语言的printf机制和编程逻辑有更深刻的理解。
    C++ 参考手册
    在这里插入图片描述

💯题目:B2090 年龄与疾病

B2090 年龄与疾病
在这里插入图片描述

题目描述:

某医院进行了一项研究,想知道某项疾病是否与年龄有关。因此对以往的诊断记录进行整理,统计0-18、19-35、36-60、61及以上这四个年龄段的患者人数占总患者人数的比例。

输入格式

输入共2行:

  1. 第一行包含一个整数 N N N ( 0 < N ≤ 100 ) (0 < N \leq 100) (0<N100),表示总患者人数。
  2. 第二行包含 N N N 个整数,代表这 N N N 个患者就诊时的年龄。

输出格式

输出共4行:

  1. 第1行包含一个百分数,表示0-18岁这个年龄段的患者人数占总患者人数的比例,精确到小数点后2位。
  2. 第2行包含一个百分数,表示19-35岁这个年龄段的患者人数占总患者人数的比例,精确到小数点后2位。
  3. 第3行包含一个百分数,表示36-60岁这个年龄段的患者人数占总患者人数的比例,精确到小数点后2位。
  4. 第4行包含一个百分数,表示61岁及以上这个年龄段的患者人数占总患者人数的比例,精确到小数点后2位。

输入输出样例

输入样例 #1

10
1 11 21 31 41 51 61 71 81 91

输出样例 #1

20.00%
20.00%
20.00%
40.00%

输入样例 #2

12
10 19 96 94 58 57 34 18 99 5 13

输出样例 #2

25.00%
25.00%
16.67%
33.33%

💯初始代码分析与问题排查

初始代码如下:

#include <iostream>
using namespace std;int main()
{int n = 0;cin >> n;int arr[n];int sum = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;for(int i = 0; i < n; i++){cin >> arr[i];sum++;if(i <= 18)sum1++;else if(i <= 35)sum2++;else if(i <= 60)sum3++;elsesum4++;}double rate1 = 100.0 * sum1 / sum;double rate2 = 100.0 * sum2 / sum;double rate3 = 100.0 * sum3 / sum;double rate4 = 100.0 * sum4 / sum;printf("%0.2lf% ", rate1);return 0;    
}

问题点分析

  1. 逻辑错误:

    • 判断条件 if(i <= 18) 中,i 是数组的索引,而不是输入的年龄值。这导致判断逻辑与题目要求不符。
    • 索引 i 的范围是 0n-1,无法正确反映年龄范围。
  2. 范围错误:

    • 题目要求的范围是 0-18, 19-35, 36-60, 61及以上,但代码未正确实现。
    • 代码中未对数组的值进行比较,而是直接比较索引值。
  3. 数组定义错误:

    • 在C++中,int arr[n]; 使用了变长数组,这是C99标准支持的特性,但并非所有C++编译器都支持。应使用动态内存分配(如new)或标准容器(如vector)。
  4. 输出格式错误:

    • printf("%0.2lf% ", rate1); 多余的空格和单独的%符号导致输出不符合题目要求。
    • 百分号%需要用%%来表示,确保格式化输出。
  5. 未释放动态分配内存:

    • 如果使用动态数组,代码未正确释放分配的内存。

💯修正后的代码与优化

#include <iostream>
#include <cstdio>
using namespace std;int main()
{int n;cin >> n;int* arr = new int[n]; // 动态分配数组int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;for (int i = 0; i < n; i++) {cin >> arr[i];if (arr[i] >= 0 && arr[i] <= 18)sum1++;else if (arr[i] >= 19 && arr[i] <= 35)sum2++;else if (arr[i] >= 36 && arr[i] <= 60)sum3++;else if (arr[i] >= 61)sum4++;}// 计算比例printf("%.2lf%%\n", 100.0 * sum1 / n);printf("%.2lf%%\n", 100.0 * sum2 / n);printf("%.2lf%%\n", 100.0 * sum3 / n);printf("%.2lf%%\n", 100.0 * sum4 / n);delete[] arr; // 释放动态分配内存return 0;
}

修正与优化要点

  1. 修正逻辑错误:

    • 使用 arr[i] 比较输入的年龄值,而不是索引 i
  2. 调整范围判断:

    • 按题目要求分别比较 0-18, 19-35, 36-60, 61及以上
  3. 动态内存分配:

    • 使用 new 动态分配数组,并在程序结束时使用 delete[] 释放内存,防止内存泄漏。
  4. 输出格式修正:

    • 使用 %% 正确输出百分号。
    • 每行输出结果以换行符 \n 结尾,确保格式正确。
  5. 代码简洁性:

    • 合理命名变量,增强代码可读性。
    • 省去冗余的 sum++ 操作,直接用输入数量 n 作为总人数。

💯拓展:printf 中的特殊字符处理

在C语言的printf函数中,有一些特殊字符需要注意处理,类似于上述代码中使用的%%。以下是常见的特殊字符及其用法:

1. 百分号 %

  • 原因% 是格式说明符的起始符号,用于标记格式化占位符(如 %d, %f)。如果需要输出实际的 % 符号,必须使用 %%
  • 示例
    printf("成功率为 50%%\n");
    
    输出:
    成功率为 50%
    

2. 反斜杠 \

  • 原因:反斜杠 \ 是转义字符的起始符号,必须用双反斜杠 \\ 表示实际的 \
  • 示例
    printf("This is a backslash: \\\n");
    
    输出:
    This is a backslash: \
    

3. 双引号 "

  • 原因:双引号 " 在字符串常量中需要用转义字符 \" 表示。
  • 示例
    printf("She said, \"Hello, World!\"\n");
    
    输出:
    She said, "Hello, World!"
    

4. 常见转义字符

  • 换行符\n
  • 制表符\t
  • 回车\r
  • 退格\b
  • 响铃\a
  • 反斜杠\\
  • 双引号\"

💯总结

通过对题目“年龄与疾病”的深入分析和代码优化,我们不仅修正了代码中的逻辑问题和格式错误,还系统性地探讨了C语言中printf函数处理特殊字符的机制。这些知识点不仅适用于此题目,还对其他编程场景具有指导意义。

在实际开发中,理解格式化输出函数的工作机制,掌握正确的特殊字符处理方法,是写出健壮代码的重要一步。希望本文能帮助读者从细节中理解C语言编程的核心思想,从而在复杂问题的解决中游刃有余。


在这里插入图片描述


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

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

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

相关文章

电商Google广告:2025年提升转化率的5种策略

展望 2025 年&#xff0c;Google 广告领域将迎来一系列显著变化&#xff0c;这些趋势对于提升广告转化率至关重要&#xff0c;值得我们提前关注与布局。 智能化程度持续加深&#xff0c;用户搜索习惯愈发精细&#xff0c;广告格式推陈出新&#xff0c;视频广告势头正猛...那么…

【pytorch练习】使用pytorch神经网络架构拟合余弦曲线

在本篇博客中&#xff0c;我们将通过一个简单的例子&#xff0c;讲解如何使用 PyTorch 实现一个神经网络模型来拟合余弦函数。本文将详细分析每个步骤&#xff0c;从数据准备到模型的训练与评估&#xff0c;帮助大家更好地理解如何使用 PyTorch 进行模型构建和训练。 一、背景 …

编程入门(2)-2024年 RAD Studio version 12发布综述

随着2024年即将画上句号&#xff0c;我想借此机会回顾一下我们在这一年中发布的一些Embarcadero产品、行业趋势&#xff0c;并感谢我们尊贵的客户们对我们的产品一如既往的支持。这一年对我们来说充满了激动人心的变化和发展&#xff0c;我们非常高兴能与您一起踏上这段旅程。 …

visual studio 安全模式

一、安全模式&#xff1a; 在 Visual Studio 中&#xff0c;安全模式是一种启动方式&#xff0c;允许你在禁用所有扩展和自定义设置的情况下启动 Visual Studio。这个模式可以帮助排除插件或扩展引起的问题&#xff0c;特别是在 Visual Studio 无法正常启动时。 二、安全模式下…

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…

EasyExcel自定义动态下拉框(附加业务对象转换功能)

全文直接复制粘贴即可&#xff0c;测试无误 一、注解类 1、ExcelSelected.java 设置下拉框 Documented Target({ElementType.FIELD})//用此注解用在属性上。 Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中&#xff0c;jvm加载class文件之后&#xff0c…

【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…

Web安全扫盲

1、建立网络思维模型的必要 1 . 我们只有知道了通信原理&#xff0c; 才能够清楚的知道数据的交换过程。 2 . 我们只有知道了网络架构&#xff0c; 才能够清楚的、准确的寻找漏洞。 2、局域网的简单通信 局域网的简单通信&#xff08;数据链路层&#xff09; 一般局域网都通…

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

009:传统计算机视觉之边缘检测

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 本节来看一个利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测&#xff1f; 边缘检测是通过一些算法来识别图像中物体之间或者物体与背景之间的边界&…

QML使用Popup实现弹出Message

方案一&#xff1a;popup import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15ApplicationWindow {visible: truewidth: 640height: 480title: qsTr("Top Message Popup Example")ColumnLayout {anchors.centerIn: parentspacing: 10Butt…

idea java.lang.OutOfMemoryError: GC overhead limit exceeded

Idea build项目直接报错 java: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceeded 设置 编译器 原先heap size 设置的是 700M , 改成 2048M即可

boot-126网易邮件发送

【SpringBoot整合JavaMail发送邮件】 一 . Java Mail基本概念 1.SMTP Simple Mail Transfer Protocol:简单邮件传输协议&#xff0c;用于发送邮件的协议。 2.POP3 Post office Protocol 3:邮局通讯协议第三版&#xff0c;用于接收邮件的标准协议。 3.IMAP Internet Message Acc…

【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 操作 其他数据 检查影像的属性 熟悉检查您正在使用的栅格属性非常重要。

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

[Python学习日记-74] 面向对象实战2——选课系统

[Python学习日记-74] 面向对象实战2——选课系统 简介 开发要求 实现&#xff1a;选课系统 简介 在前面的《年会答题系统》当中我们介绍了面向对象软件开发的一些流程&#xff0c;当然这一流程只是涵括了大部分的&#xff0c;目前在业界也没有一个统一的标准&#xff0c;每个…

用户注册模块(芒果头条项目进度4)

1 创建⽤户模块⼦应⽤ 1.1 在项⽬包⽬录下 创建apps的python包。 1.2 在apps包下 创建应⽤userapp $ cd 项⽬包⽬录/apps $ python ../../manage.py startapp userapp 1.3 配置导包路径 默认情况下导包路径指向项⽬根⽬录 # 通过下⾯语句可以打印当前导包路径 print(sys.pa…

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者&#xff1a;来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布&#xff0c;它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

关于Flutter应用国际化语言的设置

目录 1. Locale配置 2. 用户切换/启动自动加载缓存里面的locale 由于最近在开发app国际化设置的时候遇到一些问题&#xff0c;所以做出一些总结。 1. Locale配置 具体的初始化配置可以参考文档&#xff1a;i18n | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 值得…