getchar、putchar以及输入缓冲区

news2024/11/19 10:27:14

目录

1.getchar和putchar的文献

1.1关于getchar的文献:

1.2关于putchar的文献

1.3返回值问题

2.从键盘中输入一个字符

2.1原理💨

🚩2.2如何理解:

❗理解1:

❗理解2:

2.3关于程序如何结束

3.输入密码

3.1调用一次getchar读取相当于"吸收掉该字符"1️⃣

3.2多个字符且字符之间有空格2️⃣

3.3关于scanf的读取问题3️⃣

4.ASCLL码表

4.1只打印数字字符的代码:

4.2图解(也可以作为查找)


前言:

        我们知道输入输出函数有scanf/printf。除此之外,还有getchar、putchar等函数,那今天这篇文章就开始记录这两个函数的功能和用途。

1.getchar和putchar的文献

1.1关于getchar的文献:

getchar - 读取一个字符

翻译: 

1.2关于putchar的文献

putchar - 输出/打印一个字符

翻译:

1.3返回值问题

因为:读取到字符的时候返回的是字符的ASCII码值,取值范围:ASCII:0~127

但如果读取失败,则返回的是EOF ---> -1 

2.从键盘中输入一个字符

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}

	return 0;
}

按F5执行,光标闪烁,说明在等待,要你输入东西。

2.1原理💨

getchar和scanf是用来输入数据的,那直接是从键盘上拿吗?不是。

🚩2.2如何理解:

❗理解1:

实际上,在键盘和各输入函数之间是有一个输入缓冲区的,在键盘上输入字符‘A’的时候,这时候键盘输入的‘A’还没到缓冲区,只有当按下回车的时候,那就触发了条件,同时也放了'\n'到缓冲区,对于getchar这个函数来说一次读一个字符,就读取走了'A',因为是while循环,所以第二次进入循环的时候, 会把'\n'读取进去

所以putchar输出的时候,'\n'造成的换行效果导致光标在第二行闪烁(红色箭头

注意这里:putchar是输出,getchar是读取

❗理解2:

以下仅限于getchar函数

可以理解成两个缓冲区,字符输入的时候一个键盘缓冲区,会把输入东西放进键盘缓冲区,然后按下回车(enter)之后会有一个输入缓冲区,之后这个getchar函数从输入缓冲区里面读取数据,是这样的一个过程

关于理解1和理解2

就是一个理解上的一个差异而言,实质上没什么区别。

2.3关于程序如何结束

 注意:键盘shift+6^+Z,这样是不能让程序停下来

需要:ctrl+Z,小写大写都无所谓的,都会转成Z

3.输入密码

预测的可能结果:printf("请输入密码:>");之后输入字符,输入完之后,

打印printf("请输入密码(Y/N):>");之后选择输入'Y'或者非'Y'的字符,打印确认成功或者确认失败

#include<stdio.h>
int main()
{
	printf("请输入密码:>");
	char password[20] = { 0 };
	scanf("%s", password);
	printf("请输入密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

可是事实上却是:

原因:

还有个疑问就是:为什么scanf不读取'\n'?回车是为了按,为了触发,为了把在控制台输入的东西,放到缓冲区里面,让scanf去读取,才按的回车,回车不是密码的内容

'\n'--回车都是密码吗?不是


 

3.1调用一次getchar读取相当于"吸收掉该字符"1️⃣

修改:

int main()
{
    printf("请输入密码:>");
    char password[20] = { 0 };
    scanf("%s", password);
    getchar();//处理'\n' -->加上这个位置才不会让程序发生错误
    printf("请输入密码(Y/N):>");
    int ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

确认成功:

确认失败:

3.2多个字符且字符之间有空格2️⃣

注意:“回车”和空格也是字符

同样是上面修改之后的程序,输入以下字符串,会发生错误

int main()
{
    printf("请输入密码:>");
    char password[20] = { 0 };
    scanf("%s", password);
    getchar();//处理'\n' -->加上这个位置才不会让程序发生错误
    printf("请输入密码(Y/N):>");
    int ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

原因:

修改:

#include<stdio.h>
int main()
{
	printf("请输入密码:>");
	char password[20] = { 0 };
	scanf("%s", password);
	//清理缓冲区
	while (getchar() != '\n')//读取了也不用,不接受返回值,不存储元素,只是让它清理一下
	{
		;
	}
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

注意:

while (getchar() != '\n') 这个位置可以换成其它字符,意思是读到这个元素就不读取了

 

3.3关于scanf的读取问题3️⃣

scanf默认是读取到空格就结束了

#include<stdio.h>
int main()
{
	char arr[20] = {0};
	scanf("%s", arr);
	printf("%s\n", arr);

	return 0;
}

执行: 

 

但是如果写成这样:

意思是一直往后面读取,直到遇到'\n',

#include<stdio.h>
int main()
{
    char arr[20] = {0};
    scanf("%[^\n]", arr);//[^]这里面可以换成其它字符,但是换的那个最终要在缓冲区那里得放                                    //进去那个字符,'\0'就挺难的

    return 0;
}
 

 执行:

 

4.ASCLL码表

4.1只打印数字字符的代码:

#include <stdio.h>
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch < '0'|| ch > '9')//这段代码的意思是在这个范围内的都不打印
        continue;
     putchar(ch);
 }
 return 0;
}

输出: 

注意这里:

\0读取的时候把'\'输出跳过,然后直接输出'0'

控制台的每一个输入都是字符,只是看它是什么类型

这里有的是数字类型的字符,其实就是数字的意思

4.2图解(也可以作为查找)

只打印红色框里面的字符

 这个表也可以供参考使用。欢迎大佬补充!

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

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

相关文章

开发笔记之:文件读取值溢出bug分析(JAVA版)

&#xff08;1&#xff09;引言 以下是Java读取数据文件&#xff08;FileInputStream&#xff09;的代码&#xff1a; /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头&#xff08;字节序&#xff09;* return 双字值 | <code>-1</cod…

vue2 axios请求后端数组数据 并展示

目录 1 vue加依赖 --> 终端中install 2 main.js 引入依赖 3 components -> 组件中 如 HelloWorld.vue 中 3.1 中定义数组 并接收数据赋值给数组 3.2 el表格 接收数据数据 并展示出来 4 效果 1 vue加依赖 --> 终端中install npm i axios vue-axiosnpm i element…

Cesium教程(一):Cesium的下载和安装

目录 1、Cesium简介 2、Cesium下载和安装 2.1 下载方式1 2.2 下载方式2 3、Cesium测试 4、我的第一个Ceisum程序《HelloCesium》 1、Cesium简介 首先进入Cesium官网 Cesium 是 3D 地理空间平台Cesium 是软件应用程序的开放平台&#xff0c;旨在释放 3D 数据的力量。用于…

RocketMQ的安装讲解详细手册--------以及启动Broker启动找不到类问题

RocketMQ的安装 1.RocketMQ安装 1.1下载RocKetMQ 下载地址&#xff1a;https://rocketmq.apache.org/release-notes/2017/12/13/4.2.0 下载解压后 bin:可执行文件目录 confidence&#xff1a;配置文件目录 lib:依赖库&#xff0c;是一些jar包 1.1配置ROCKETMQ_HOME 解压…

前端工程化配置

前端工程化配置指南 如何构建一个工程化的前端库&#xff0c;并结合 Github Actions&#xff0c;自动发布到 Github 和 NPM 的整个详细流程。 示例 我们经常看到像 Vue、React 这些流行的开源项目有很多配置文件&#xff0c;他们是干什么用的&#xff1f;他们的 Commit、Releas…

如何利用Jmeter从0到1做一次完整的压测

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压测…

Selenium自动化测试设计模式 —— PO模式

前言&#xff1a; 在python自动化过程中&#xff0c;Selenium自动化测试中有一个名字常常被提及PageObject&#xff08;思想与面向对象的特性相同&#xff09;&#xff0c;通过PO模式可以大大提高测试用例的维护效率。 不了解po设计模式的可自行百度 面向对象的特性&#xf…

Class 05 - 逻辑运算符and,or,not 和 条件语句 if

Class 05 - 逻辑运算符and,or,not 和 条件语句 if 逻辑运算符和条件语句逻辑运算符 and , or , notand 运算符“&”OR 运算符 “|”not 运算符“&#xff01; 案例运用 and , or , notsubset() 筛选数据AND 实例OR 实例NOT 实例混合使用实例 条件语句 ifif 语句else语句els…

五分钟搞懂Web UI自动化测试中的POM设计模式。

今天&#xff0c;我们来聊聊Web UI自动化测试中的POM设计模式。 为什么要用POM设计模式 前期&#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本&#xff08;以快递100网站登录举栗&#xff09;&#xff1a; 使用以上代码&#xff0c;最基础最…

RabbitMQ五种消息模型

文章目录 1.简单消息队列模型2.Work工作队列模型3.发布订阅模型3.1.Fanout广播3.2.Direct路由3.3.Topics通配符 RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型&#xff0c;只不过进行路由的方式不同。 1.简单消息队列模型 简单消息队…

Midjourney提示词资源、使用技巧、艺术家资源网站收录

为了帮助艺术家们使用Midjourney更专业、准确地创作更完美的艺术作品&#xff0c;我们收录了一些Midjourney提示词资源分享、提示词书写技巧、相关专业工具&#xff0c;同时还有一些相关艺术家资源帮艺术家们找到创作灵感。有很多是社区内资深玩家分享的云文档&#xff0c;资源…

【机器视觉3】双目立体视觉模型

双目立体视觉模型 简单模型一般模型 简单模型 假设两个摄像机平行放置于同一高度、光轴平行、成像平面重合、焦距相同、左右图像每一行y坐标方向、大小相同&#xff0c;如下图所示&#xff1a; 由左右成像平面上的点、目标物点、焦距、摄像机中心基线距离的几何关系可以得到&…

MySQL学习指南笔记经典案例句

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 该文章是一篇关于MySQL的一个学习的笔记或是指南&#xff0c;该文章中有很多的经典的案例可进行相应的练习和参考&#xff0c;后期的话会持续更新关于数据库系统方面的文章。 MySQL学…

供应商评估:关键标准以及如何执行

几乎每个行业的企业都与制造商、进口商、服务提供商和分销商等供应商合作。由于通常有几个供应商可供选择&#xff0c;进行供应商评估有助于企业选出其中最符合其业务需求的供应商。 什么是供应商评估&#xff1f; 供应商评估是企业在为其产品或材料选择供应商时使用的过程。…

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…

iOS swift5 获取系统或其他app已经连接的蓝牙设备

文章目录 chatGPT答案1.2 retrievePeripheralsWithIdentifiers 本人实例参考博客 chatGPT答案 1.1 retrieveConnectedPeripherals(withServices (本人没有测试成功) 要获取系统或其他app已连接的蓝牙设备&#xff0c;你可以使用CoreBluetooth框架提供的CBCentralManager类。下…

【节点边际电价】机组运行约束对机组节点边际电价的影响分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

新人如何学习软件测试

零基础学习软件测试不失为一个好的选择&#xff0c;虽然IT行业里对小白最友好的非软件测试莫属了&#xff0c;但是也要看你个人在学习软件测试这件事上面花费了多少的时间和努力了~ 每年毕业季&#xff0c;IT行业依然是比较热门且收入是最高的行业。对于应届毕业生来说想要进入…

Unity3d 开发Pico4应用打开工程卡在Importing(iteration xxx) busy for xx:xx)...问题记录

问题 大致问题如题&#xff1a; 步骤是参照了PICO官方给出的快速开始的步骤进行的&#xff0c;而这个我问题的出现是在导入 PICO Unity Integration SDK 前往 SDK 下载中心&#xff0c;下载最新版本的 SDK。 1.解压所下载的 SDK 压缩包。 2.你将会得到一个包含 package.json…

微服务圣经1:零基础搭建一套SpringCloud微服务脚手架(SpringCloud+Dubbo+Docker+Jenkins)

说在前面 在40岁老架构师尼恩的读者社群&#xff08;50&#xff09;中&#xff0c;大量的小伙伴是架构师、高级开发&#xff0c;大家都有丰富的开发、架构经验。 在开发过程中&#xff0c;一般情况下&#xff0c;大家都是用现有的开发框架。 导致的一个严重问题是&#xff1…