24.【C语言】getchar putchar的使用

1.基本作用 

用户输入字符,getchar()获取字符(含\n:即键入的Enter)(字符本质上是以ASCII值或EOF(-1)存储的)(与scanf有区别)

putchar() 打印字符(把得到的ASCII值转换成字符)(相当于printf)

由于getchar putchar只操作字符,因此执行效率高

例:

#include <stdio.h>
int main()
{int ch = 0;while ((ch = getchar()) != EOF){putchar(ch);}return 0;
}

while后的含义:ch=getchar() 键盘输入的字符经缓冲区之后被getchar获取后转到ch变量中 

                           !=EOF 不等于(!=)EOF(End Of File文件结束或者读取错误)

2.工作的底层原理

int main()
{char password[20] = { 0 };printf("请输入密码:>");scanf("%s", password);printf("请确认密码(Y/N):>");int ch = getchar();//字符本质上是以ASCII值存储的,所以用intif (ch == 'Y'){printf("确认成功\n");printf("密码:%s",password);}else{printf("确认失败\n");}return 0;
}

 

程序并没有按期望运行

模型解释:输入函数<-->缓冲区<-->键盘

注意getchar和scanf的区别:

getchar是从输入缓冲区挨个读取字符的函数,包括回车键 (其一次只能读取一个字符)

scanf在读取时会根据格式字符串中的格式说明符来确定如何读取数据。例如,除了%c外,当遇到空格、制表符或换行符时,scanf()会停止读取,直到遇到下一个非空白字符(即非空格、制表符或换行符的字符)

解决问题:只要删除留下的\n,缓冲区就没有数据,getchar就会等待用户输入Y或N

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{char password[20] = { 0 };printf("请输入密码:>");scanf("%s", password);printf("请确认密码(Y/N):>");
//************************************************************************getchar();//清理缓冲区,处理\n,读取了但是并没有赋值给ch,相当于“白读”
//************************************************************************int ch = getchar();if (ch == 'Y'){printf("确认成功\n");printf("密码:%s",password);}else{printf("确认失败\n");}return 0;
}

但此法有缺陷

若遇到带空格的密码

缓冲区:123456 abc 

运行过程: 因为当遇到空格、制表符或换行符时,scanf()会停止读取,所以scanf读取123456

getchar();一次只能读取一个字符,所以只读取空格,导致int ch=getchar();中ch被赋值为abc,

输出确认失败

解决问题:设计一个循环,只要还剩字符就读取,直到\n才停止读取

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

密码反而前后不一致了( 空格和abc都没有赋值给ch)

scanf是有缺陷的

可换成gets

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

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

相关文章

pip 提示坏了 pip丢失重新安装

(base) PS K:\download\pip丢失重新安装\3.8.1以上> conda active py361 usage: conda-script.py [-h] [-v] [--no-plugins] [-V] COMMAND ... conda-script.py: error: argument COMMAND: invalid choice: active (choose from clean, compare, config, create, info, init…

代码随想录算法训练营DAY55|42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 题目链接&#xff1a;42. 接雨水双指针 class Solution(object):def trap(self, height):""":type height: List[int]:rtype: int"""lh [0]*len(height)rh [0]*len(height)lh[0]height[0]for i in range(1, len(height)):lh[i] …

嵌入式系统中状态机实现详解

嵌入式开发中系统经常处于某种状态,如何处理呢?接下来分析一下,状态机的实现无非就是 3 个要素:状态、事件、响应。转换成具体的行为就 3 句话。 发生了什么事? 现在系统处在什么状态? 在这样的状态下发生了这样的事,系统要干什么? 用 C 语言实现状态机主要有 3 种方法…

LeetCode 60.排序排列(dfs暴力)

给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213""231""312""321" 给定…

机器学习——岭回归

1、岭回归与线性回归的区别 岭回归&#xff08;Ridge Regression&#xff09;和线性回归&#xff08;Linear Regression&#xff09;都是用于回归分析的统计方法&#xff0c;但它们在处理方式和应用场景上有一些关键的区别&#xff1a; a)基本概念 线性回归&#xff1a;目标是…

css 函数(简略)与单位

css 函数&#xff08;简略&#xff09; 1、基础&#xff1a;content: attr()&#xff0c;url()&#xff0c; var()&#xff0c; element()&#xff0c; image-set()&#xff0c; 计数器&#xff1a; counter()&#xff0c; counters() 2、颜色&#xff1a; rgb()&#xff0…

在pycharm里如何使用Jetbrains AI Assistant

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…

ABAP 发送正文含图片邮件

背景&#xff1a; 客户要求系统发送的邮件内容中含logo图片 解决&#xff1a; 参考outlook中带图片的邮件&#xff0c;有两种形式&#xff0c;一种为url链接&#xff0c;需要点击下载才展示图片&#xff0c;一种为直接显示&#xff1b;如果使用ABAP发送该类型的邮件&#xff0…

python类继承和类变量

Python一些类继承和实例变量的使用 定义基类 class APIException:code 500msg "Sorry, error"error_code 999def __init__(self, msgNone):print("APIException init ...")def error_400(self):pass复用基类的属性值 class ClientTypeError(APIExcept…

【密码学】RSA公钥加密算法

文章目录 RSA定义RSA加密与解密加密解密 生成密钥对一个例子密钥对生成加密解密 对RSA的攻击通过密文来求得明文通过暴力破解来找出D通过E和N求出D对N进行质因数分解通过推测p和q进行攻击 中间人攻击 一些思考公钥密码比对称密码的机密性更高&#xff1f;对称密码会消失&#x…

SQL使用join查询方式找出没有分类的电影id以及名称

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 现有电影信息…

深度学习与浅层学习:技术变革下的竞争态势

深度学习与浅层学习&#xff1a;技术变革下的竞争态势 在过去十年中&#xff0c;深度学习的崛起对整个人工智能领域产生了巨大影响&#xff0c;几乎在各种任务中显示出超越传统浅层学习方法的性能。这种变化不仅推动了技术的进步&#xff0c;还对硬件市场&#xff0c;尤其是显…

分库分表真的适合你的系统吗?

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

mongodb-docker-compos-安装

镜像信息 dockerFile&#xff1a; https://github.com/docker-library/mongo 初始化创建 mkdir -p {db,configdb,logs,mongodbConfig} touch docker-compose.yml配置7.0 services:mongo-7.0.0-server:image: mongodb/mongodb-community-server:7.0.0-ubi8container_name: m…

数据库DDL与DML

在数据库中&#xff0c;可以把 SQL 分为两个部分&#xff1a;数据操作语言 (DML) 和 数据定义语言 (DDL)。 DML&#xff1a; SELECT - 从数据库表中获取数据 select * from 表名 where … UPDATE - 更新数据库表中的数据 update 表名 set… DELETE - 从数据库表中删除数据 del…

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一&#xff1a;下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二&#xff1a;配置项目 创建新的Qt项目&#xff1a; 打开VS2022&#xff0c;创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…

C# 用户权限界面的测试内容

测试用户权限界面的主要目标是确保权限管理功能按照设计工作&#xff0c;同时保证用户界面响应正确&#xff0c;不会出现意外的行为或安全漏洞。以下是C#中用户权限界面测试的一些关键内容&#xff1a; 1. 功能性测试 权限分配与撤销&#xff1a;测试权限的分配和撤销功能&am…

场景管理分析平台介绍

在数字化浪潮的推动下&#xff0c;数据已成为企业决策的重要依据。特别是在智能驾驶、虚拟现实和物联网等领域&#xff0c;场景数据的高效管理和利用至关重要。在智能驾驶领域面对海量的场景数据&#xff0c;如何高效处理、精准分析&#xff0c;并将其转化为有价值的决策支持&a…

第一次作业

作业1 1.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

站群服务器与普通服务器之间的区别

普通的服务器就是一种用于托管单个网站或者是应用程序的服务器方案&#xff0c;普通服务器能够提供独立的资源和环境&#xff0c;比较适用于单个网站的运行和管理&#xff1b;站群服务器则是一种用于托管多个网站的服务器方案&#xff0c;可以允许在同一服务器上管理和部署多个…