我在做密码回显的时候,发现当自己用scanf输入id后,(做密码回显用的是getchar()),程序直接跳过输入密码的步骤。
在网上搜索了一下,原来是因为前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’,所以如果不在此加一个getchar()把这个回车符取走的话,getchar()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误,要解决这个问题,就要防止在使用getchar()之前还有’\n’;处理方法是使用while(getchar()!=’\n’); 清除之前的回车
https://www.cnblogs.com/CQWF/p/9495309.html ,还是看别人的总结吧:
这个博客对输入函数scanf,gets,getchar都进行了简单区别测试
https://blog.csdn.net/keneyr/article/details/50821595 可以看一下
以下回答摘自百度知道:
1、那个回车符没有伴随着scanf语句的结束而消失;
2、scanf认为回车符,空格符是分隔符,会自动跳过,因而不会影响下一个scanf。
3、getchar是读入一个字符,不管是不是分隔符,都不会跳过。
https://zhidao.baidu.com/question/225085956.html
以下摘自百度百科:
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
其调用格式为: scanf("<格式化字符串>",<地址表>);
函数 scanf() 是从标准输入流stdin (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
getchar由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值。当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键
getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回,getch返回值是用户输入的ASCⅡ码,出错返回-1。输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行。