C语言常用输入函数有很多,这里主要讲解以下几个:
1. scanf():
从缓冲区读取键盘输入,遇见回车或空格结束,并将回车或空格留在缓冲区
函数弊端:将垃圾数据(空格、回车、tab键)遗留在缓冲区,当需要连续使用scanf 输入字符时,会导致下一个输入函数读取到缓冲区的垃圾数据,从而导致第二次从键盘读取失败。举例如下:
这里键盘输入 a空格b回车结束后,第一个字母a打印出来了,第二个字母变成了空的,这就是第一个scanf读取完a之后,将空格保留在了缓冲区中,第二个scanf直接就接收了缓冲区中的空格字符,所以word2接收的是空格,后续打印ASSCII码值得以验证。
这里输入 a回车就直接结束了,原因还是一样回车为结束符,然后下一个scanf读取了缓冲区的 \n不难看出,这里自动换行了,且通过打印ASSCII码也能值得以验证。
注意:scanf只有在读取字符时需要考虑换行符问题。
2. int getchar(void):
从缓冲区读取一个字符
解决scanf的弊端可以使用getchar()函数,该函数也是从缓冲区读取内容,一次只读取一个字符,所以可以在scanf后跟一个getchar()解决字符串问题。举例如下:
图中有连续输入,当输入一个 n 和 回车 后,程序直接结束了,fgets自然而然接收了缓冲区遗留下来的 \n , 所以当我们在使用scanf函数并且需要连续输入时,在每一次使用完scanf后,需要用getchar() 吃掉脏数据后, 才能继续从键盘读取。
如图,这样就能正常两次输入了。
3. gets函数具有不安全性,不建议使用,这里不做讲解,具体可参考:
4. char* fgets(char *s, int size, FILE *stream);
参数1:读取内容的存放容器
参数2:读取大小
参数3:从哪里读(从键盘读取填stdin)
返回值:读取成功返回读取到内容的指针,失败返回-1
一般用于读取文件内容,也可读取键盘输入
函数弊端:遇见回车结束,将 \n 一起存进输入的字符串中最后加上\0 结尾,例如从键盘输入的abcd, 实际字符串为 abcd\n\0 ,对于需要对输入数据进行精确处理的程序,这样会导致一些错误,所以我们一般在实际开发中使用时,务必去除最后的换行符。以下是例子:
图中可以看到,通过fgets从标准输入中读取hello,按回车结束,打印函数返回的字符串, 在没有添加换行符的情况下,自动换行了。那么下面我们手动将换行符去掉,看看效果。
可以看出我们将字符串的最后一位字符改为 \0 后,再次打印字符串中的换行消失了。
总结:
scanf()函数输入字符串时,有脏数据遗留在缓冲区
getchar() 用于吃掉脏数据
fgets() 输入字符串时,字符串末尾将携带有回车符,缓冲区清空。