我们使用最广泛的输入方式应该是scanf函数,scanf可输入的数据类型范围广,使用便捷。但其也不乏缺陷,而且某些时候使用gets和getchar会更加高效。
先来说说scanf
scanf属于stdio.h函数库,支持多种数据类型(整型,浮点型,字符型,指针...),经常和输出函数printf一起使用,使用的最为广泛。
在这里想要强调的是scanf的弊端:
1.向scanf中输入内容时,最后按下的回车键将会被保留在缓冲区内。有些时候这个留下的回车会影响到程序正常运行,通常用getchar()或者scanf(“%c”)......将回车吸收
2.scanf读入内容的时候,如果你输入了空格或者回车,后续内容将不会被读入。如下程序
intmain() { chara[12]; scanf("%s",a); printf("%s",a); return0; }
输入“i love you”,输出结果为“i”。证明第一个空格以后所有内容都没被读入。
但是gets函数不会出现第二种情况,gets中输入的空格将会被读入。下面我们来介绍gets函数
gets
gets函数只用于读入字符或者字符串(非要读整型数也可以,可能会警告甚至error),经常和puts()搭配使用。
使用格式如下
chara[5]; gets(a); puts(a);
gets函数以回车键为结束标志,并且会把这个回车键读入然后替换成\0,不会遗留在缓冲区内,这点可以弥补scanf第一点不足。
而且gets函数可以正常读入空格,弥补了scanf第二点不足。
当然gets自身也有不足,gets不会检查输入内容,可能会出现缓冲区溢出越界等问题。这时候可以利用fgets函数弥补这点不足。
fgets
fgets函数和gets函数有相似部分:用于输入字符串。是的,fgets只能用于输入字符数组,不能用于整型等等。相应的它和fputs函数配套使用。
使用格式如下
chara[10]; fgets(a,10,stdin); fputs(a, stdout);fgets函数的参数有三个:数组名,下标,stdinstdin就是指从键盘获取字符
dgets可以检查是否溢出,比gets更加安全