【C++】深入探讨基础输入输出及类型转换问题

news2024/11/30 13:17:58

在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目一:整数输入输出
    • 代码实现
    • 代码分析
  • 💯题目二:ASCII 码转换为字符
    • 代码实现
    • 代码分析
  • 💯`cin` 与 `char` 搭配行为的深入剖析
    • 问题描述
    • 原因分析
    • 如何解决该问题?
      • 方法 1:使用 `int` 读取整数后转换为 `char`
      • 方法 2:使用字符串处理输入
  • 💯小结


在这里插入图片描述


💯前言

  • 在深入学习 C++ 的过程中,输入输出操作以及类型转换问题是至关重要的基础知识。本文通过分析两道经典的基础题目,深入探讨了 cinchar 类型之间的交互行为,以及 char 类型如何存储整数值。这两道题目虽然看似简单,但它们背后却蕴含了 C++ 语言中对字符与整数的处理规则与原理,旨在帮助初学者和更高阶的学习者更好地理解 C++ 中的输入输出机制及隐式类型转换的细节。
    C++ 的输入输出操作是程序的基础环节之一,直接决定了程序如何与用户进行交互。对于初学者来说,理解 cincout 的用法,以及它们如何与数据类型转换相结合,是掌握编程语言的重要环节。通过下面两个示例,我们将深度剖析这些基本概念。
    C++ 参考手册
    在这里插入图片描述

💯题目一:整数输入输出

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

输入一个整数,输出这个整数。

输入格式

一个整数,范围在 32 位有符号整数范围内。

输出格式

输出这个整数。

输入输出样例

输入 #1:

3

输出 #1:

3

代码实现

以下是实现这一题的代码:

#include <iostream>
using namespace std;

int main() {
    int number;           // 定义一个整型变量
    cin >> number;        // 从输入流中读取整数
    cout << number << endl; // 输出整数并换行
    return 0;             // 程序结束,返回0表示成功
}

在这里插入图片描述


代码分析

在这里插入图片描述

  1. 输入部分:用 cin 从标准输入中读取整数。
  2. 输出部分:用 cout 将读到的整数输出到标准输出,endl 用于换行并刷新输出缓冲区。
  3. 数据类型选择:题目要求输入的整数范围在 32 位有符号整数范围内,而 int 类型在大多数编译器中占用 32 位,因此 int 类型足够存储题目要求的范围,适合用于此题。

这一题的代码非常简单,但也奠定了输入输出操作的基础。int 类型在大多数编译器中占用 32 位,即可表示的整数范围为 -2,147,483,648 到 2,147,483,647,完全符合题目要求。因此,使用 int 既简洁又合适,能够很方便地满足题目中对数据范围的需求。


💯题目二:ASCII 码转换为字符

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

输入一个 ASCII 码,输出对应的字符。

输入格式

一个整数,即字符的 ASCII 码,保证存在对应的可见字符。

输出格式

一行,包含相应的字符。

输入输出样例

输入 #1:

65

输出 #1:

A

说明/提示

保证所有数据 < 128 并且 > 0。


代码实现

以下是实现这一题的代码:

#include <iostream>
using namespace std;

int main() {
    signed int num;   // 定义一个有符号整数变量
    cin >> num;       // 读取用户输入的 ASCII 码
    char ch = num;    // 将整数转换为对应的字符
    cout << ch << endl; // 输出该字符
    return 0;         // 返回0表示程序成功结束
}

在这里插入图片描述
题目中说明:“一个整数,即字符的 ASCII 码”,那么就必须使用一个 int 类型的变量来输入数值。因为 C++ 中的 cin 是根据变量的类型在缓冲区读取数据的。换成 char 类型是行不通的,虽然 char 类型的变量也是能存储这个 ASCII 值的。


代码分析

在这里插入图片描述

  1. 输入部分:首先定义一个 signed int 类型的变量 num,用来存储用户输入的 ASCII 码。
  2. 类型转换:将输入的整数 num 转换为 char 类型,并赋值给 ch。在 C++ 中,char 类型和整数之间可以进行隐式转换,这是因为 char 本质上是一个字节的整数。
  3. 输出部分:用 cout 输出字符 ch,并用 endl 换行。

ASCII 码是一个从 0 到 127 的整数范围,可以表示常用的字符。在本题中,我们读取用户输入的整数,将其转换为对应的字符,并输出。char 类型本身是一个字节,因此可以存储从 -128 到 127 的值(有符号情况下),这也是为什么可以直接将整数赋值给 char 类型的原因。


💯cinchar 搭配行为的深入剖析

  • 在讨论题目二的过程中,我们尝试直接一开始用char接收传入的ASCII值,发现了一个有趣的现象:当我们用 cin 读取 char 类型的数据时,如果输入的是 65,输出的却是字符 '6'。这并不是因为 char 无法存储整数 65,而是因为 cinchar 类型搭配时的特性 导致的。下面我们来详细分析这一现象。
    在这里插入图片描述

问题描述

在这里插入图片描述
当你输入 65 时,程序输出的是字符 '6',而不是预期的 'A'。如下代码所示:

#include <iostream>
using namespace std;
int main()
{
	char ch;
	cin >> ch;
	cout << ch << endl;
	return 0;	
}

运行结果

输入:65
输出:6

原因分析

在这里插入图片描述

  1. cin 读取字符行为

    • 当使用 cin >> ch 来读取 char 类型的变量时,cin 会从输入流中读取一个字符,而 只取输入的第一个字符
    • 当你输入 65 时,cin 只会读取第一个字符 '6',并将其存储到 ch 中,后面的字符 '5' 被忽略。这意味着输入的 65 实际上被拆分为了两个字符 '6''5',而 char ch 只接收第一个字符。
  2. char 的存储本质

    • char 本质上是一个 1 字节的整数类型,可以存储从 -128127(有符号)或 0255(无符号)的值。
    • 在存储时,char 可以存储任意在其范围内的整数值,但这与输入行为无关。问题出在 cin 的读取规则上,而不是 char 的存储能力。

如何解决该问题?

在这里插入图片描述
如果你希望输入一个整数(如 65),并将其转换为对应的字符,可以采用以下方法:


方法 1:使用 int 读取整数后转换为 char

在这里插入图片描述

#include <iostream>
using namespace std;

int main() {
    int num;        // 定义一个整数变量
    cin >> num;     // 从输入中读取完整的数字
    char ch = num;  // 将整数转换为 char 类型
    cout << ch << endl; // 输出字符
    return 0;
}

运行结果

  • 输入 65,输出:
    Character: A
    

通过将输入存储为 int 类型,程序能够正确地读取整个数字 65,并且通过类型转换将其赋值给 char 类型,从而输出对应的字符 'A'


方法 2:使用字符串处理输入

在这里插入图片描述
如果你希望 cin 能够灵活处理字符和数字输入,可以改为使用字符串类型:

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

int main() {
    string input;
    cin >> input;
    if (input.size() == 1) {
        // 如果输入是单个字符,直接取值
        char ch = input[0];
        cout << ch << endl;
    } else {
        // 如果输入是数字,转换为整数
        int num = stoi(input);
        char ch = num;
        cout << ch << endl;
    }
    return 0;
}

运行结果

  • 输入 65,输出 A
  • 输入 6,输出 6

使用字符串可以更灵活地处理输入,不论是单个字符还是多字符的数字。这样可以根据输入的长度来判断如何处理,从而避免 cin 直接读取 char 类型时的问题。


💯小结

  • 在这里插入图片描述
    在学习 C++ 的过程中,输入输出是一个重要的基础操作,看似简单,但其中包含了许多细节需要理解。通过这两道题目,我们学习到以下几点:
  1. cinchar 类型的搭配特性

    • cin 在读取 char 类型时,只会读取第一个字符,这意味着如果输入的是多个字符,只有第一个字符会被存储。这样会导致部分数据被丢弃,产生意外的结果。
  2. char 的本质

    • char 是一个 1 字节的整数类型,可以存储 0 到 255 的值(无符号)。当将整数赋值给 char 时,实际上是在存储整数的二进制表示。因此,char 不仅可以表示字符,还可以用来进行简单的整数运算。
  3. 隐式类型转换

    • 在 C++ 中,charint 之间存在隐式转换。只要整数的值在 char 类型的范围内,转换是安全的,可以用来实现字符和 ASCII 码之间的转换。理解这种转换对于处理字符和整数的关系非常重要。
  4. 解决方法

    • 如果需要完整输入一个数字并将其转换为字符,使用 int 来处理输入是更好的选择。这样可以确保输入的完整性,避免 cin 的读取行为造成的数据丢失。
    • 如果需要灵活处理字符和数字输入,可以考虑使用字符串,并根据输入内容进行判断和处理。这样不仅能够避免 cin 直接读取 char 的问题,还能使程序更具通用性。

这些知识不仅有助于理解 C++ 的输入输出机制,还有助于编写更加健壮高效的代码。如果你在学习过程中遇到类似的问题,希望本文能够为你提供一些启发和帮助。掌握好输入输出的细节,将为编写更加复杂和有趣的程序打下坚实的基础。在编程的学习之路上,每一个细节的理解都会为你的代码质量和编程能力带来质的飞跃。希望通过这篇文章,你能够更加熟练地运用 C++ 的输入输出机制,编写出符合预期且高效的程序。


在这里插入图片描述


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

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

相关文章

GB28181系列三:SIP消息格式

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、SIP消息Header字段 二、SIP URI(URL) 三、SIP路由机制 1、路由机制介绍 2、严格路由&#xff08;Strict Routing&#xff09;与松散路由&#xff08;Louse Routing&#xff09; 3、总结 四、SIP消…

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…

算法与数据结构练习——异或

知识点讲解&#xff1a; 一、异或操作定义&#xff1a; 异或是指相同为0&#xff0c;不同为1&#xff0c;也可理解为无进位相加&#xff01;&#xff01; 很重要&#xff01;&#xff01; 二、关于异或运算的几个性质&#xff1a; 1.0^NN &#xff08;0和任何数异或都…

STM32G4系列MCU的Direct memory access controller (DMA)功能介绍之二

目录 概述 1 DMA通道 1.1 可编程数据大小 1.2 指针增量 2 通道配置 2.1 配置步骤 2.2 通道状态和禁用通道 3 模式应用 3.1 循环模式&#xff08;内存到外设/外设到内存的传输&#xff09; 3.2 内存到内存模式 3.3 Peripheral-to-peripheral模式 3.4 编程转移方向&a…

【一文读懂】大语言模型

学习参考 项目教程&#xff1a;中文教程 代码仓库&#xff1a;代码地址 仓库代码目录说明&#xff1a; requirements.txt&#xff1a;官方环境下的安装依赖 notebook&#xff1a;Notebook 源代码文件 docs&#xff1a;Markdown 文档文件 figures&#xff1a;图片 data_base&…

注册表修改键盘位置

1.winr 输入 regedit 2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 3.右键Keyboard Layout->新建->二进制值->取名Scancode Map 4.右键Scancode Map&#xff0c;修改如下 //第一列 自动生成序号&#xff0c;不用管 第一行 输入8个00 第二…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时&#xff0c;解决方法需要根据服务器的操作系统&#xff08;如 Linux 或 Windows &#xff09;和具体服务器环境来处理。以下是常见的解决办法&#xff1a; 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

shell脚本编写练习2

1.准备阶段 在根目录下创建一个目录来存储shell脚本 mkdir /s3 2.题目 1. 使用case实现成绩优良差的判断 #!/bin/bash# 假设成绩存储在变量GRADE中 read -p "请输入成绩&#xff08;0-100&#xff09;&#xff1a;" GRADE# 使用case语句进行判断 case $GRADE in[…

清远榉之乡托养机构探讨:自闭症的本质辨析

当人们谈及自闭症时&#xff0c;常常会产生一个疑问&#xff1a;自闭症是精神类疾病吗&#xff1f;今天&#xff0c;清远榉之乡托养机构就来为大家解开这个疑惑。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校&#xff0c;一直致力于为大龄自闭症患者提供专业的支持…

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速&#xff0c;汽车保有量也不断增长&#xff0c;导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求&#xff0c;通常会部署监控设备进行车位监测、现场安全监测等&#xff0c;助力构建智能化停车管理。因此如何为分…

.net XSSFWorkbook 读取/写入 指定单元格的内容

方法如下&#xff1a; using NPOI.SS.Formula.Functions;using NPOI.SS.UserModel;using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;/// <summary>/// 读取Excel指定单元格内容/// </summa…

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…

红日靶场-5

环境搭建 这个靶场相对于前几个靶场来说较为简单&#xff0c;只有两台靶机&#xff0c;其中一台主机是win7&#xff0c;作为我们的DMZ区域的入口机&#xff0c;另外一台是windows2008&#xff0c;作为我们的域控主机&#xff0c;所以我们只需要给我们的win7配置两张网卡&#…

[Java]微服务之分布式事务

介绍 下单业务&#xff0c;前端请求首先进入订单服务&#xff0c;创建订单并写入数据库。然后订单服务调用购物车服务和库存服务: 购物车服务负责清理购物车信息库存服务负责扣减商品库存 问题分析: 下单过程中, 订单服务创建订单, 插入自己的数据库, 执行成功购物车服务, 清…

存储结构及关系(一)

学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…

cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection

原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection&#xff0c;构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…

AMD的AI芯片Instinct系列介绍

AMD最强AI芯片发布&#xff01; 在旧金山举行的Advancing AI 2024大会上&#xff0c;AMD推出Instinct MI325X AI加速器&#xff08;以下简称MI325X&#xff09;&#xff0c;直接与英伟达的Blackwell芯片正面交锋。 现场展示的数据显示&#xff0c;与英伟达H200的集成平台H200 …

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…

kali linux 装 virtual box 增强工具 Guest Addition

kali linux 装 virtual box 增强工具 Guest Addition install Virtual Box Guest Addition in kali linux 搞了一下午&#xff0c;最终发现是白折腾。 kali linux 自带 virtual box 的增强工具。 kali linux 2021.3 之后的版本都是自带virtual box 增强工具 解决方法 直接…