一、 scanf()
1. scanf()函数可以读入单个字符,如果想连续读入两个单个字符则易出错。
char c1,c2;
scanf("%c",&c1);
scanf("%c",&c2);
printf("%c",c1);
printf("%c",c2);
当从终端输入a、回车时,程序就已经执行完了。
原因:scanf()是从输入流缓冲区中取数据,在scanf()取数据前,输入流缓冲区中已经有a和回车两个字符了,因此第二个scanf()函数直接读取了回车值。
2. scanf()函数读入字符串时,遇到空格、回车、TAB时会认为输入结束,而且不会讲空格、回车、TAB键读入或进行转换,因此这些字符还继续停留在输入流缓冲区中。
因此输入有空格、回车时要谨慎使用scanf()函数。
二、gets()
scanf()函数无法读入空格,而gets()函数则可以。
gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在str指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。
使用strlen()求gets()函数读取的字符串长度时,最后的null值(即‘\0’)不计算在内。
三、getchar()
getchar()函数从输入流中获取一个字符,回车符不会被读入或转换而是继续停留在输入流缓冲区中。
-------------------------------------
因此,为了避免输入流缓冲区中垃圾数据对后续读入的影响,需要清空缓冲区。
方法一:使用函数fflush(stdin)
方法二:scanf("%[^\n]",string)