1. scanf函数
scanf函数是基本的输入函数。基本格式为(int scanf( const char *format [,argument]…)
返回值为int类型,代表读取到几个数值。当读取失败时返回EOF。
其基本的用法:
一:输入一个整型变量scanf(“%d”,&a)
其中%d是整型输入控制符,&a表示变量a地址,&是取地址符。功能:读取键盘输入的整型字符,将整形字符读取到变量a所在地址。
二:输入两个整型变量scanf(“%d%d”,&a,&b),一个%d对应一个整型变量。
注意:scanf在接受多个变量时,每个变量之间要用空格,回车,或者TAB键,分隔开(可连续按多次,但一般只输入一次)。也就是scanf读取到空格,回车,或者TAB键时,自动停止,并准备读取下一个变量
在全部输入完成后,按回车终止!
2.getchar函数
getchar函数是字符读取函数,每次只读取一个字符!基本格式为 int getchar( void );
返回值为接收字符的ASCII码值。
作用:从缓冲区中读取一个字符,成功时返回这个字符的ASCII码值,失败时返回EOF。注:用户输入完数据时,会按回车键代表输入完成,但是回车键也会被存入缓冲区,输入字符’A’加空格输入完成
只要缓冲区中有数据,getchar()就会自动读取缓冲区中第一个字符,并且下次自动读取下一个字符,无需用户再次输入。
如下图代码 ,输入字符’A’并且回车确认。
#include<stdio.h> int main() { int ch = 0; int i = 0; while (i<2) { i++; ch = getchar(); putchar(ch); } return 0; }
如图所示,i=1时,打印字符’A’;i=2时,打印’\n’ 。
当循环次数改成 while(i<4)时,输入"abcde",打印"abcd"。
由此可见,只要缓冲区内有内容,getchar()就会自动读取,并且读取完之后,接着再读取下一个内容,直到缓冲区为空!
3. 应用实例
请分析下面代码:
int main() { char password[20]; printf("请输入密码:>"); scanf("%s", &password); printf("请确认密码(Y/N):\n"); int ch = getchar(); //ch接收Y、N if (ch == 'Y') printf("输入正确!\n"); else printf("输入错误!\n"); return 0; }
输入abcd结果直接为:输入错误
这是因为,当我们输入abcd后,需要按回车键确认,然而scanf取的是回车前面的数据,而’\n’被留在了缓冲区。当运行到getchar()自动读取’\n’,因此打印输入错误
而如何避免这个情况呢?我们必须提前把缓冲区清空,在运行ch = getchar()语句。
int main() { char password[20]; printf("请输入密码:>"); scanf("%s", &password); printf("请确认密码(Y/N):"); getchar(); //清空缓冲区 int ch = getchar(); //ch接收Y、N if (ch == 'Y') printf("输入正确!\n"); else printf("输入错误!\n"); return 0; }
运行成功!
我们在判断之前在加一个getchar()函数,提前将缓冲区中的\n取走,就可达到我们想要的目的,这样的方法叫做清理缓冲区。
而且我们可以用while()循环,来清理缓冲区的多个字符。
int tem = 0; while ((tem = getchar()) != '\0');//清空缓冲区的字符串 while ((tem = getchar()) != '\n');//清空缓冲区回车以前的字符
以上是本人对scanf与getchar的理解,后续会继续深入学习,希望各位大神指点!💖