c语言getchar()的用法_c=getchar()

c语言getchar()的用法_c=getchar()文章目录getchar()函数定义函数返回值注意区分getchar和scanfgetchar的使用实例getchar()函数定义getchar()-字符输入函数,没有参数,从输入缓冲区里面读取一个字符-「一次只能读取一个字符」EOF(-1)-endoffile文件结束标志-键盘上用ctrl+z实现先查一下文档函数返回值该函数以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回EOF(-1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、getchar( ) 函数定义

getchar() – 字符输入函数,没有参数,从输入缓冲区里面读取一个字符 – 「 一次只能读取一个字符 」
EOF(-1) – end of file 文件结束标志 – 键盘上用 ctrl + z 实现

先查一下文档

image-20210507174102072


二、函数返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回 EOF(-1)。所以 getchar() 函数返回值要用 int 整型变量来存储

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

运行结果:键盘上输入 abc\n,程序会在屏幕上输出 abc\n,输入 def\n,屏幕上会输出 def\n,当按下 ctrl + z 时程序结束运行

image-20210507171436005

这是为什么呢,程序的运行过程是这样的,getchar 有一个 int 型的返回值。当程序调用 getchar 时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符 \n 也放在缓冲区中),当用户键入回车之后,getchar() 函数才开始从输入缓冲区中每次读取一个字符,getchar 函数的返回值是用户输入的字符的 ASCII 码,若遇到文件结尾 (End-Of-File) 则返回 -1 (EOF),并将用户输入的字符回显到屏幕,如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调用读取。也就是说,后续的 getchar 调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。程序中 while 循环工作时,每一次循环 getchar() 就会从输入缓冲区读取一个字符,然后 putchar 输出,直到遇到了文件结束标志 EOF,循环判断条件为假,循环才结束

为啥用缓冲区呢?因为计算机CPU的处理速度是很快的,我们用键盘输入速度比不上CPU的处理速度,CPU就得等键盘输入完,很浪费资源,所以,当键盘输入完了,让CPU一次性处理,可以大大提高效率。

参考文章:getchar的使用


三、注意区分 getchar 和 scanf

对于 scanf 函数,'\n' 会触发 scanf 读取输入缓冲区的内容,但遇到 '\n' 或空格 ' ' 会停止读取,而 getchar 会直接读取 '\n' 和空格

// scanf多组输入,s,比如2008 6,使用下面语句,直到遇到'\n',停止读取
while(scanf("%d", &n) != EOF) { 
    }

四、getchar 的使用实例

再来看一个和 getchar() 函数相关的实例:模拟密码输入

#include<stdio.h>
int main()
{ 
   
	char password[20] = { 
    0 };
	//输入密码
	printf("Input password:");
	scanf("%s", password);
	//确认密码
	printf("Comfirm password(Y/N):");
	int ch = 0;
	ch = getchar();
	//判断是否确认成功
	if (ch == 'Y')
	{ 
   
		printf("success!\n");
	}
	else
	{ 
   
		printf("defeat!\n");
	}
	return 0;
}

运行结果:

image-20210508223724390

输入密码 123456 之后,程序没有让我们确认密码,直接判断确认失败了,为什么会出现这样的结果呢?

当我们在键盘上输入密码并按下回车后,键盘缓冲区有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 这些字符,此时 scanf 函数开始读取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 结束读取,这时运行到后面的 getchar 函数了,getchar 发现缓冲区里还有一个 ‘\n’ ,直接将其读取走并会返回给整型变量 ch,这时没有多余的 getchar 函数来接收字符 ‘Y’ 或者 ‘N’ 了,轮到 if 语句来判断时,ch 不等于 ‘Y’ ,输出 defeat!

那我们怎么改进,让字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已经想到了,那就是在 ch = getchar(); 语句前面增加一条 getchar(); 语句,来读取处理掉 ‘\n’ ,这样用来确认密码的那个 getchar 函数就可以接收字符 ‘Y’ 或者 ‘N’ 了

继续思考,如果我输入密码时多输了一些无用的字符,又该怎么样处理掉它们呢?比如输入 123456 abcdf\n

image-20210508230348909

需要写一个循环来读取处理掉无用的字符

修改后的代码如下:

#include<stdio.h>
int main()
{ 
   
	char password[20] = { 
    0 };
	//输入密码
	printf("Input password:");
	scanf("%s", password);
    //---清理缓冲区---
	int temp = 0;
	while ((temp = getchar()) != '\n')
	{ 
   
		;
	}
	//确认密码
	printf("Comfirm password(Y/N):");
	int ch = 0;
	ch = getchar();
	//判断是否确认成功
	if (ch == 'Y')
	{ 
   
		printf("success!\n");
	}
	else
	{ 
   
		printf("defeat!\n");
	}
	return 0;
}

运行结果:

image-20210508233110722

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180439.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Fcoin交易所的危险游戏!韭菜请远离!

    币圈一天,人间一年!Fcoin再一次用币圈速度验证了上面这句话并非虚言。Fcoin上线半个月,平台交易量即雄霸全球数字货币榜首,远超币安、OKEx、火币等老牌交易所,成为宇宙第一数字货币交易所。与Fcoin交易量蹿升速度相当的,还有Fcoin的平台币FT,一个月上涨百倍!成为币圈人士口中争相传播的百倍币。一、并不新鲜的Fcoin“交易挖矿”Fcoin能在短时间崛起,主要依靠的是“交易挖矿”模…

    2022年4月16日
    38
  • 各种技术网站的网址

    各种技术网站的网址http://www.eclipse.com/http://www.apache.org

    2022年7月17日
    14
  • densenet解析_给我一个承诺详细解读

    densenet解析_给我一个承诺详细解读这篇文章是DenselyConnectedConvolutionalNetworks的解读,在精简部分内容的同时补充了相关的概念。如有错误,敬请指正。

    2022年9月29日
    0
  • git clone几种可选参数的使用与区别[通俗易懂]

    git clone几种可选参数的使用与区别[通俗易懂]背景githubclone代码的速度,依赖于代码库的大小以及clone速度,基本是几十kb到200kb之间。要是能达到400kb,恭喜你;要是只有十几kb,emmmm,还是先去吃饭吧。这里以MOOC为例说明在clone某个git仓库时候需要注意的几个问题。全克隆单一克隆深度克隆全克隆很好理解,gitclonegit_仓库_url。存在一个问题,当clone…

    2022年7月21日
    25
  • 【技能树】预备知识-Python简介「建议收藏」

    【技能树】预备知识-Python简介「建议收藏」目录简介发展历史发展历程GuidovanRossum(吉多·范罗苏姆)人物经历主要成就ABC语言GNU特点优点缺点和其他语言区别Hello,World!简介Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Python是一种解释型语言:这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。Python是交互式语言

    2022年5月20日
    33
  • Java中Scanner的用法:单行/多行输入

    Java中Scanner的用法:单行/多行输入Java的Scanner用法,主要用于算法笔试时的控制台输入问题:解决这种情况下的Scanner输入:单行,多行,数值,字符串最好解决的情况单行输入多个字符串多行输入多个字符串问题:解决这种情况下的Scanner输入:单行,多行,数值,字符串平时写程序一般不用Scanner,线上笔试的时候,各大公司热衷于Scanner输入。平时用LeetCode刷题也不会用到,结果多次在笔试时候卡在Scan……

    2022年7月20日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号