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( ) 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解VSCode下C++环境配置过程

    详解VSCode下C++环境配置过程

    这篇文章主要介绍了VSCode C++环境配置过程,在这大家需要在代码的目录下的.vscode文件夹下创建launch.json、tasks.json,具体实现过程跟随小编一起看看吧
    2021-11-11
  • VC中实现GB2312、BIG5、Unicode编码转换的方法

    VC中实现GB2312、BIG5、Unicode编码转换的方法

    这篇文章主要介绍了VC中实现GB2312、BIG5、Unicode编码转换的方法,该功能非常实用,需要的朋友可以参考下
    2014-07-07
  • C语言结构体定义的方法汇总

    C语言结构体定义的方法汇总

    结构体是一种工具,用这个工具可以定义自己的数据类型。下面通过本文给大家分享了C语言结构体定义的方法汇总,需要的朋友参考下吧
    2017-12-12
  • C++ 类访问控制的条件总结

    C++ 类访问控制的条件总结

    这篇文章主要介绍了C++ 类访问控制的条件总结的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++运算符重载规则详解

    C++运算符重载规则详解

    这篇文章主要介绍了C++运算符重载规则详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++中引用、内联函数、auto关键字和范围for循环详解

    C++中引用、内联函数、auto关键字和范围for循环详解

    本文主要梳理了C++当中一些琐碎的知识点,包括有命名空间,缺省参数,引用,auto关键字和内联函数,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • Qt数据库应用之实现通用数据生成器

    Qt数据库应用之实现通用数据生成器

    有两种应用场景需要用到数据生成器,一种是需要测试数据库性能,一种是随机模拟生成一堆数据,用来测试程序的性能。本文将利用Qt实现通用数据生成器,需要的可以参考一下
    2022-02-02
  • Qt之ui在程序中的使用-多继承法介绍

    Qt之ui在程序中的使用-多继承法介绍

    本文将介绍Qt之ui在程序中的使用-多继承法,需要的朋友可以参考
    2012-11-11
  • C语言如何使用函数求素数和举例

    C语言如何使用函数求素数和举例

    素数又称质数,所谓素数是指除了1和它本身以外,不能被任何整数整除的数,下面这篇文章主要给大家介绍了关于C语言如何使用函数求素数和的相关资料,需要的朋友可以参考下
    2022-11-11
  • C++数据结构之哈希算法详解

    C++数据结构之哈希算法详解

    这篇文章主要为大家详细介绍了C++数据结构中哈希算法的相关资料,文中的示例代码讲解详细,具有一定的借鉴价值,希望对大家有所帮助
    2022-12-12

最新评论