概述
fgets ,gets, getchar, scanf函数
- 1.scnaf()
- 2.fgets()
- 3.gets()
- 4.getchar()
1.scnaf()
函数原型
#include <stdio.h>
int scanf(const char *format, …);
功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
scanf进行输入时,遇到空格符或者换行符就会表示一次读取结束,但是空格符和换行符并不会输入,而是留在缓冲区等待下一次的读取。
例
#include <stdio.h>
int main()
{
char buf[5];
char c;
int a;
scanf("%s", buf);
scanf("%c", &c);
scanf("%d", &a);
printf("---------n");
printf("%sn", buf);
printf("%d, %c!n", a, c);
return 0;
}
结果显示
由以上结果可知,第一个输入的是字符串,空格,数字,结果显示空格也被读入,第二个输入的是字符串,回车,数字,结果显示回车也被读入。
众所周之,scanf以空白字符为定界符,但如果输入的字符串是以其它字符为定界符的,那怎么办?[]就是专门处理这个问题的转换说明符。
2.scanf("%[^abcd]", a);
在输入中限定用abcd这四个字符,如输入其他的字符,则输入结束,其他的字符在缓存读数区里留给下一个输入或丢掉。
•scanf("%[abcd]"%s, a, b)
输入abcdefg时,abcd进入a字符串,当输入e时跳出a字符串的输入,efg进入b字符串。
2.scanf("%[^abcd]", a);
除abcd以外的数可以输入,如输入abcd这四个其中任意一个,则跳出输入字符串。
3.scanf("%10[^abcd]", ptr);
输入的字符串中最多只能有10个字符,多出来的字符进入缓存区留给下一个输入或丢掉。
4.scanf("%[a-zA-Z]", a);
扫描列表由大小写各26个字母组成。
对于减号-,只有在紧贴[字符或抑扬字符以及作为扫描列表最后一个成员时,-字符才会被视为扫描列表的成员。c标准把其余情况规定为编译器相关的。大多数编译器把这种情况的减号定义为连字符
2.fgets()
虽然用 gets() 时有空格也可以直接输入,但是 gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,gets 无法检测到这个问题,就会发生内存越界,所以编程时一般建议使用 fgets()。
fgets()原型
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
fgets() 虽然比 gets() 安全,但安全是要付出代价的,代价就是它的使用比 gets() 要麻烦一点,有三个参数。它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。
param:s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。
param:size 代表的是读取字符串的长度。
param:stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流,即从某个文件中读取。标准输入流就是输入缓冲区。所以如果是从键盘读取数据的话就是从输入缓冲区中读取数据,即从标准输入流 stdin 中读取数据,所以第三个参数为 stdin。
返回值:返回读入的字符的个数。
例1
# include <stdio.h>
int main(void)
{
char str[10]; /*定义一个最大长度为19, 末尾是'