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

news2025/1/7 13:05:51

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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++;
        else
            sum4++;
    }

    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.coloradmin.cn/o/2271677.html

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

相关文章

面试题解,JVM中的“类加载”剖析

一、JVM类加载机制说一下 其中&#xff0c;从加载到初始化就是我们的类加载阶段&#xff0c;我们逐一来分析 加载 “加载 loading”是整个类加载&#xff08;class loading&#xff09;过程的一个阶段&#xff0c;加载阶段JVM需要完成以下 3 件事情&#xff1a; 1&#xff0…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

构建一个rust生产应用读书笔记7-确认邮件3

设计架构思路 从前面的学习过程中&#xff0c;我们从单一文件测试套件发展到模块化测试套件&#xff0c;并构建了一套强大的辅助工具&#xff0c;这是一个非常重要的进展。个人认为测试代码和应用代码一样&#xff0c;是一个持续进化的过程。随着项目的不断成长&#xff0c;测…

默认ip无法访问,利用dhcp功能获取ip进行访问的方法

应用场景&#xff1a; ac的默认ip如192.168.1.1在pc与ac的eth2以后网口直连无法ping通&#xff0c;而且pc改为dhcp自动获取ip也获取不到ip地址&#xff0c;无法进行web配置和命令行操作。 原因是ac或其他设备被修改了默认ip或者对应端口所属vlanid&#xff0c;现在的端口vlan…

redis的集群模式与ELK基础

一、redis的集群模式 1.主从复制 &#xff08;1&#xff09;概述 主从模式&#xff1a;这是redis高可用的基础&#xff0c;哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从服务器&#xff…

大脑特训,自信 “满格”

编辑&#xff1a;念小艺 在追求自信的漫漫长路上&#xff0c;诸多因素如同闪耀的星光&#xff0c;为人们指引着方向。保持良好的饮食习惯&#xff0c;让身体摄取充足且均衡的营养&#xff0c;为精神的饱满提供坚实后盾&#xff1b;持续投身于锻炼之中&#xff0c;在挥洒汗水的…

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本号及作者无关&#xff0c;请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台&#xff01;&#xff0…

计算机的发展、计算机基本组成原理

计算机系统 软件 硬件 硬件的发展 软件的发展 低级语言&#xff1a;机器语言、汇编语言 一、早期冯诺依曼机的结构 存储程序&#xff1a;将指令以二进制代码事先输入计算机的主存储器 在计算机系统软件和硬件是等效的 软件&#xff1a;数据 程序 硬件&#xff1a; 存储器、…

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…

[极客大挑战 2019]HardSQL 1

看了大佬的wp&#xff0c;没用字典爆破&#xff0c;手动试出来的&#xff0c;屏蔽了常用的关键字&#xff0c;例如&#xff1a;order select union and 最搞的是&#xff0c;空格也有&#xff0c;这个空格后面让我看了好久&#xff0c;该在哪里加括号。 先传入1’ 1试试&#…

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一&#xff09;问题&#xff1a;用ULINK2给STM32F103C8T6下载程序&#xff0c;下载方式设置如下&#xff1a; 出现下面两个问题&#xff1a; 1&#xff09;下载问题界面如下&#xff1a; 这个错误的信息大概可以理解为&#xff0c;在0x08000063地址上读取到flash存储为FF&am…

使用命令行管理git项目

# 初始化一个新的Git仓库 git init # 添加文件到暂存区 git add <file> # 提交暂存区的更改到仓库 git commit -m "commit message" # 查看当前仓库的状态 git status # 查看提交历史 git log # 查看文件的改动 git diff <file> # 创建一个新…

论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models

1.abstract 最近推出的3D高斯飞溅(3DGS)&#xff0c;它用多达数百万个原始椭球体来描述场景&#xff0c;可以实时渲染。3DGS迅速声名鹊起。然而&#xff0c;一个关键的悬而未决的问题仍然存在&#xff1a;我们如何将多个3DG融合到一个连贯的模型中&#xff1f;解决这个问题将使…

javaEE-网络原理-1初识

目录 一.网络发展史 1.独立模式 2.网络互联 二.局域网LAN 1.基于网线直连&#xff1a; 2.基于集线器组件&#xff1a; 3.基于交换机组件&#xff1a; 4.基于交换机和路由器组件 ​编辑 三、广域网WAN 四、网络通信基础 1.ip地址 2.端口号&#xff1a; 3.协议 4.五…

电子电气架构 --- 整车整车网络管理浅析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

xml格式化(3):增加头部声明

前言 这篇文章&#xff0c;是用来增加头部声明。 正文 from lxml import etreedef pretty_print(element, level0, indent" "):result ""# 判断元素是否为注释节点if isinstance(element, etree._Comment):result f"{indent * level}<!--{el…

STM32 高级 物联网通讯之LoRa通讯

目录 LoRa通讯基础知识 常见的3种通讯协议 远距离高速率的传输协议 近距离高速率传输技术 近距离低功耗传输技术 低功耗广域网 采用授权频段技术 非授权频段 LoRa简介 LoRa的特点 远距离 低功耗 安全 标准化 地理定位 移动性 高性能 低成本 LoRa应用 LoRa组…

【FlutterDart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100)

上效果 预期的是通过拖动一条边界线改变窗口大小&#xff0c;类似vscode里拖动效果。这个是简单的拖动实现 上代码&#xff1a; import package:flutter/material.dart;class MyDraggableViewDemo extends StatelessWidget {const MyDraggableViewDemo({super.key});override…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…