【C语言】scanf,getchar,getch函数详解

编译环境:sublime text 3 + cmd运行窗口

一、函数简介

1.输入函数scanf()

scanf()函数是printf()函数的逆操作,它可以把输入的字符串转换成整数、浮点数、字符和C的字符串形式。
输入示例:

这里写图片描述

*如果使用scanf()来读取整数、浮点数、字符等基本变量类型的值,请在变量名前加上一个&。
*如果使用scanf()把一个字符串读进一个字符数组中,请不要使用&。
*scanf()函数使用换行、制表符(tab)和空格来决定怎样把输入分成几个字段,以下统称空白字符。scanf()函数依次把转换说明与字段相匹配,并跳过它们之间的空格。
*除了在%c模式下外,在读取输入时,scanf()会跳过空白字符直到第一个非空白字符处。
*scanf()函数允许把普通字符放在格式字符中,除了空白字符外的普通字符一定要与输入字符准确匹配。

如果我们是用上述的示例程序去检验输入,并且以空白字符分字段,那么将发现结果和预期有很大出入,因为%c会读取空白字符,要想得到预期输出,可以用getchar()函数去读取空白字符。

2.getchar()

ch = getchar();scanf(“%c”,&ch);有同样的效果

与scanf()不同的是,getchar()没有参数,它返回来自输入设备的下一个字符,getchar()不需要格式说明符,因为它只对字符(ASCII码表中的字符)起作用,并且一次只能读取来自stdin标准输入流的一个字符。如果我们想要读取多个字符可以使用while或者for语句。
while((ch = getchar())!= '\n');

输出比较:

a图
这里写图片描述
b图
这里写图片描述
那么a图里输入的字符串aaa去哪里了呢?事实上它在输入缓冲区排队等着我们去读它。如果按照a图里的输入方式输入并用getchar()去读取在缓冲区中的aaa,会发现读到的第一个字符并不是a而是一个空格,此时我们看一下a图的输入就可以找到原因了。

缓冲区的概念在后面会有介绍,我们现在可以作此理解,键盘输入的数据被排着队放在一个空房间里(缓冲区),当我们需要它的时候再按顺序取出来。scanf()是边放边取,而getchar()是直接取按顺序来的下一个字符,也就是说如果scanf()没取完数据的话,就算我们不输入任何数据,getchar()也能取到数据。

3.getch()

在介绍getch()之前首先我们记住,要用getch()必须引入头文件“conio.h”,并且此函数非标准库函数。

getch()直接从键盘获取数据,不等待用户按回车,只要用户按一个键,getch就立刻返回并且输入结果不回显。
这里写图片描述
我们可以看到输入a字符后只有printf()的输出结果。

顺便介绍一下getch()的兄弟getche(),getche()是一个输入回显函数,我们可以输入下面的代码感受一下getch()和getch()、getchar()函数的区别。

#include<stdio.h>
#include<conio.h>
int main(int argc, char const *argv[])
{
    char ch;
    ch = getche();
    //ch = getch();
    //ch = getchar();
    printf("%c\n",ch );
    return 0;
}

二、函数返回值

1.scanf()

scanf()成功读取几个变量就返回几。
ch = scanf("%d %d %d",&a,&b,&c);若三个变量都成功读取则返回3,即ch=3。
用scanf()读取文件时,读到文件末尾出错则返回EOF。

2.getchar()

getchar()的返回值是用户输入的第一个字符的ASCII码,如出错返回-1。

3.getch()

getch()返回值是用户输入的ASCII码,出错返回-1。

三、输入缓冲区

缓冲区概念:计算机读取数据时, 在内存中开辟的临时存储数据的区域。

一般情况下,由键盘输入的字符并没有直接送入程序,而是被存储在一个缓冲区当中。缓冲又分为两种,行缓冲和完全缓冲。对于完全缓冲来说,缓冲区满时被清空(内容被发送到指定的目的地)。这种缓冲通常出现在文件输入中。对于行缓冲来说,遇到一个换行符,则清空缓冲区,键盘输入是标准的行缓冲,因此,按下换行键的时候才会清空缓冲区。

需要注意的是,getche()和getch()直接接收键盘输入的数据而不是从缓冲区读取,所以在使用这两个函数时,执行程序时并不需要用按回车键确认语句执行,程序会自动跳转到下一语句执行。

参考文章:

《C Primer Plus》第五版

【C】C语言输入输出缓冲区

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值