在C语言中,能构获取字符串的函数至少有两个:scanf( )函数和gets( )函数都可用于输入字符串,两者虽然都在stdio.h文件中但其功能上有些许不同。主要体现在:scanf不能接受空格、制表符Tab、回车等,而gets能够接受空格、制表符Tab和回车等;即当用scanf()函数录入一行字符串,如果字符串中含有空格,那么空格以后的所有字符都不会录入。而使用gets()函数则不会出现这种情况,gets会把包含和空格在内的所有字符都录入到程序中。这是scanf和getsd表面上的区别。殊不知,scanf与gets还有一段“爱恨情仇”。
这周的C语言课后作业中有一道题涉及到scanf()函数与gets()函数连用的情况,先执行scanf语句对数据进行录入,然后需要执行gets语句对一行字符串(包含空格)进行录入,可是当我运行程序时发现,gets函数语句没有被执行,但是gets函数语句后面的语句却正常执行了,顿时内心充满了疑惑。通过查找资料,最终找到了原因。
原来是在C语言中,当使用scanf函数读取输入时,输入缓冲区中的换行符会留在缓冲区中,直到下一次输入操作。因此,如果在scanf后使用gets函数,gets函数会读取缓冲区中的换行符,从而导致程序出现错误。可以使用getchar函数来清除缓冲区中的换行符,或者使用fgets函数代替gets函数来读取输入。但我没有用以上两种方法去避免这个bug,而是连用两个gets语句,第一个语句被scanf跳过了,但是第二个gets语句可以正常执行。