scanf()与gets()的冲突

来源:互联网 发布:淘宝汽车用品店排名 编辑:程序博客网 时间:2024/05/21 20:24

scanf()是C/C++的标准输入函数,其作用是从输入流(缓冲区)中读入数据到指定的地址中。以空格、回车、制表符为输入字符串的结束标志,不会将其读入目标地址中。


gets()是在stdio.h中的输入函数,也是从标准输入流中读取一行字符到指定的字符串中,它只有在遇到EOF或回车换行符时才会结束,也不将其读入,而是在末尾添加一个NULL作为结束标记。所以gets()常用来读入一整行字符,而无须担忧其中的空格是否能读入的问题。

二者混合使用时,常会出错。关键就在于二者使用的结束标记不同。输入字符串时,scanf()或cin>>遇到空格、回车、Tab结束,但在缓冲区中还留着这些结束符,此后如果使用gets()想去获取下一行字符串,它碰到的却是前面遗留下来的回车(或者回车之前还有空格等空白符),那么这次gets()就直接失效了。所以就出现了常碰到的第一个字符串变成空白字符串的现象。

处理方法:
方法1,用一句 while(getchar()!='\n'); 来处理掉缓冲区里的回车换行符,然后再gets()就正常了。
方法2,如果很明确地就知道缓冲区还留着这么个回车换行符,那就直接读入吧: scanf("\n");或者getchar()读入一个字符,然后 接着gets()也就不会有问题了。
转自:http://hi.baidu.com/sky_space/item/54864a1b9fcd0d9e99ce33ce
0 0