编译环境: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》第五版