gets()函数的不足:不检查预留存储区是否能够容纳实际输入的数据,多出来的字符简单地溢出到相邻的内存区
fgets()函数改进gets()函数的上述不足,可以指定最大读入字符数
fgets()函数为文件I/O而设计,与gets()函数有3点不同:
1)需要第二个参数以说明最大读入字符数,若该参数为n,fgets()将读取最多n-1个字符
2)如果fgets()函数读取到换行符,会将其存储到字符串中,而不是像gets()函数那样丢弃
3)还需要第三个参数以说明读取哪一个文件,如果是从键盘上读取数据,可以使用stdin(代表standard input)作为该参数,stdin在stdio.h中定义
示例代码:
/* test of fgets() function */
#include #define MAXC 20int main(void)
{char name[MAXC]; // 分配空间char * p;printf("I need a name:\n");p = fgets(name, MAXC, stdin); // 使用fgets()函数从键盘获得字符串,函数共3个参数printf("%s is a nice name.\n", p); // 显示,确认读取数据return 0;
}
运行结果:
注意:fgets()函数把换行字符也存储到了字符串中
对于重要的编程,应该使用fgets()而不是gets(),因为gets()不检查目标数组是否能够容纳输入,所以很不安全
scanf()更基于获取单词而不是字符串
gets()函数会读取所有字符,直到遇到第一个换行符为止
scanf()函数使用两种方式决定输入结束:
1)如果使用%s格式,字符串读到(但不包括)下一个空白字符(空格、制表符、换行符)
2)如果指定字段宽度,比如%10s,scanf()会读入10个字符或只到遇到第一个空白字符,由二者中最先满足的那个终止输入
无论上面哪种方法,scanf()读取字符串时都是以遇到的第一个非空白字符开始
scanf()函数返回一个整数值,该值代表成功读取的项目数;或者当遇到文件结束时返回一个EOF
示例代码:
/* test of scanf() function */
#include int main(void)
{char name_1[20], name_2[20];int n;printf("I need 2 names:\n");n = scanf("%6s %10s", name_1, name_2);printf("the %d names are %s and %s", n, name_1, name_2);return 0;
}
运行结果:
根据所需输入的特点,用gets()从键盘读取文本可能更好,简洁、易用,唯一需要注意的问题是数据大小不能超出存储区大小
scanf()主要用于以某种标准形式输入的混合类型数据的读取和转换;或者希望一次只输入一个单词