C语言中getchar( ) 函数使用详解

 更新时间:2022年12月06日 11:36:43   作者:CodeWinter  
getchar() 字符输入函数,没有参数,从输入缓冲区里面读取一个字,需要注意一次只能读取一个字符,这篇文章主要介绍了C语言中getchar函数使用详解,需要的朋友可以参考下

一、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

到此这篇关于C语言中getchar( ) 函数详解的文章就介绍到这了,更多相关c语言getchar( ) 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中双冒号::用法案例详解

    C++中双冒号::用法案例详解

    这篇文章主要介绍了C++中双冒号::用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C++ 基本数据类型中int、long等整数类型取值范围及原理分析

    C++ 基本数据类型中int、long等整数类型取值范围及原理分析

    这篇文章主要介绍了C++ 基本数据类型中int、long等整数类型取值范围及原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 深入解析Linux下\r\n的问题

    深入解析Linux下\r\n的问题

    本篇文章是对Linux下\r\n的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解C++ cin.getline函数

    详解C++ cin.getline函数

    这篇文章主要介绍了C++ cin.getline函数的相关资料,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-09-09
  • c语言合并两个已排序数组的示例(c语言数组排序)

    c语言合并两个已排序数组的示例(c语言数组排序)

    如何将两个已排序数组合并成一个排序数组,下面我们给出使用c语言合并两个已排序数组的示例,需要的朋友可以参考下
    2014-03-03
  • C++获取MD5算法实现代码

    C++获取MD5算法实现代码

    这篇文章主要介绍了C++获取MD5算法实现代码,这个是网上扒下来的 作者已经无法知道是谁了 ,可以备用
    2019-04-04
  • 封装常用正则表达式的用法

    封装常用正则表达式的用法

    这篇文章主要介绍了使用C++封装常用正则表达式的用法,方便以后直接使用,最后还给出了测试代码,大家可运行测试使用
    2014-03-03
  • 使用Qt开发实现字幕滚动效果

    使用Qt开发实现字幕滚动效果

    我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • C语言实现随机生成6位数密码

    C语言实现随机生成6位数密码

    这篇文章主要为大家详细介绍了如何使用C语言实现一个简单而实用的随机密码生成器,该生成器将生成包含字母、数字和特殊字符的随机密码,有需要的小伙伴可以参考下
    2023-11-11
  • OpenCV实现霍夫变换直线检测

    OpenCV实现霍夫变换直线检测

    这篇文章主要为大家详细介绍了OpenCV实现霍夫变换直线检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论