c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf

gets——从标准输入接收一串字符,遇到'\n'时结束,但不接收'\n',把 '\n'留存输入缓冲区;把接收的一串字符存储在形式参数指针指向的空间,并在最后自动添加一个'\0'。
getchar——从标准输入接收一个字符返回,多余的字符全部留在输入缓冲区。
fgets——从文件或标准输入接收一串字符,遇到'\n'时结束,把'\n'也作为一个字符接收;把接收的一串字符存储在形式参数指针指向的空间,并在'\n'后再自动添加一个'\0'。

简单说,gets是接收一个不以'\n'结尾的字符串,getchar是接收任何一个字符(包括'\n'),fgets是接收一个以'\n'结尾的字符串。

scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。

gets可以接收空格

scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格

 

函数原型 

char *fgets(char *buf, int bufsize, FILE *stream); 

fgets用法:

fgets(buf,sizeof(s),stdin):
楼主的函数调用是这个意思:
首先,s 肯定是一个字符数组。
该调用从 标准输入流 stdin (也就是键盘输入)读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中(前提是buf已经申请好空间了)

fgets(buf, n, file)

函数功能:从 目标文件流 file 中读取 n-1 个字符,放入以 buf 起始地址的内存空间中。

 

②一个问答题:

ASK

如果定义了两个字符数组a[10]  b[10]
然后连续用两个
fgets(a,11,stdin);
fgets(b,11,stdin);
然后用两个puts依次打印出两个字符数组的内容.
如果第一次输入的时候超过了10个字符(其中没有按回车键).
那么在第一次回车后会显示两个字符串的内容,第一次输入的多于10个的字符保存到了第二个字符数组中。
请问这是为什么?fgets不是行缓冲输入吗?
具体例子如下:

 1 #include"stdio.h"
 2 #include"string.h"
 3 void main()
 4 {
 5     char str1[10];
 6     char str2[10];
 7     fgets(str1,11,stdin);
 8     fgets(str2,11,stdin);
 9     /*fgets的用法,
10     第一个参数为数组,
11     第二个为数组的大小,
12     第三个网上stdin是标准输入(也就是键盘输入),
13     C标准库里面的一个全局变量stdin也是FILE*类型的,
14     因此在使用FILE*类型作为参数的地方,可以使用stdin*/    
15     printf("%s\n%s\n",str1,str2);
16     printf("%c\n",str2[0]);
17 }

 

输入asdfasdfasdf123


回车后直接输出两组字符串
asdfasdfas
df123

ANSWER

字符串超长,fgets读了size-1个字符还没有读到'\n',就把已经读到的size-1个字符和一个'\0'字符存入字符数组,剩下的字符可以在下次调用fgets时继续读。
输入asdfasdfasdf123,第搜索一次fgets只取走了前10个字符,余下的df123被下一次fgets取走了。
另外,还有两点:
1)包含的是系统头文件,建议用如下形式:
   #include <stdio.h>
   #include <string.h>
2)你这里fgets中size指定为11,而定义字符数组时,大小却为10,这样会溢出的。 你这里运行没问题是因为字符数组的数组名作参数时被自动转换为字符指针了。

posted @ 2018-03-13 22:22  路人浅笑  阅读(1442)  评论(0编辑  收藏  举报