gets
读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符(\0),然后把这个字符串交给调用它的程序。
它将读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。
c Primer plus上的例子:
#include <stdio.h>
#define MAX 81
int main(void)
{
char *ptr;
char name[MAX]; /* 分配空间*/
printf("what's your name?");
ptr = gets(name);
printf("%s?ah ! %s!\n", name,ptr);
return 0;
}
gets()函数通过两种方式获取输入:
1.使用一个地址把字符串赋予name
2.get()代码使用return关键字返回字符串的地址,程序把这个地址分配给ptr.
如果出错或者gets()遇到文件结尾,就返回一个空(或0)地址。这个空地址成为空指针,并用stdio.h里定义的常量NULL表示。
因此gets()加入一些错误检测while(gets(name) != NULL),getchar的错误检测为:while((ch = getchar())!=EOF)
ps:空指针是一个地址,而空字符是一个char类型的数据对象,其值为0。数值上两者都可以用0表示,但概念不同,NULL是一个指针,
而0是一个char类型常量。
fgets
弥补gets()不检查预留存储区是否能够容纳实际输入数组,造成多处的字符溢出到响铃内存区。fgets()是为文件I/O设计。
与gets不同方面为:
1.需要参数说明最大读入字符数。如果参数值为n,读取做多n-1个字符或者读完一个换行符为止,由两者最先满足结束输入。
2.存取换行符。不像gets()那样丢弃
3.参数说明读哪一个文件。从键盘上读可以使用stdin.
#include <stdio.h>
#define MAX 81
int main(void)
{
char *ptr;
char name[MAX]; /* 分配空间*/
printf("what's your name?\n");
ptr = fgets(name,MAX,stdin);
printf("%s?ah ! %s!\n", name,ptr);
return 0;
}
scanf
使用%s格式,字符串读到(但不包括)下一个空白字符(空格、制表符或换行符)。如果指定了字段的宽度,比如%5s,scanf就会读入5个字符
或直到遇到第一个空白字符,有二者最先满足的那个终止输入。
scanf()函数返回一个整数值,这个值是成功读取的项目数;或者遇到文件结束时返回EOF。
#include <stdio.h>
#define MAX 81
int main(void)
{
char name1[11],name2[11];
int count;
printf("please enter 2 names.\n");
count = scanf("%5s %10s", name1 ,name2);
printf("i read the %d names %s and %s.\n",
count, name1, name2);
return 0;
}