①getsc++
【1】函数:gets(字符指针)程序员
【2】头文件:stdio.h(c中),c++不需包含此头文件数组
【3】原型:char*gets(char*buffer);函数
【4】功能:从stdin流中读取字符串,直至接受到换行符或EOF时中止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不做为读取串的内容,读取(接受)的换行符被转换为null值,并由此来结束字符串。spa
【5】返回值:读入成功,返回与参数buffer相同的指针;读入过程当中遇到EOF(End-of-File)或发生错误,返回NULL指针。因此在遇到返回值为NULL的状况,要用ferror或feof函数检查是发生错误仍是遇到EOF。指针
【6】注意:本函数能够无限读取,不会判断上限,因此程序员应该确保buffer的空间足够大,以便在执行读操做时不发生溢出。若是溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了不这种状况,咱们能够用fgets()来替换gets()。这个事实致使gets函数只适用于玩具程序。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
和scanf("%s:",&s)的比较htm
1.不一样点:内存
scanf不能接受空格、制表符Tab、回车等;字符串
而gets可以接受空格、制表符Tab和回车等;get
2.相同点:
字符串接受结束后自动加'\0'。
使用scanf("%s",&s);函数输入字符串时存在一个问题,就是若是输入了空格会认为字符串结束,对于gets()函数:空格后(包括空格)的字符将做为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止
对于scanf();若首个字符为空格,scanf("%s",&s);会从空格后的字符做为首个输入项;
getchar——从标准输入接收一个字符返回,多余的字符所有留在输入缓冲区。
fgets——从文件或标准输入接收一串字符,遇到'\n'时结束,把'\n'也做为一个字符接收;把接收的一串字符存储在形式参数指针指向的空间,并在'\n'后再自动添加一个'\0'。
简单说,gets是接收一个不以'\n'结尾的字符串,getchar是接收任何一个字符(包括'\n'),fgets是接收一个以'\n'结尾的字符串。
scanf( )函数和gets( )函数均可用于输入字符串,但在功能上有区别。
gets能够接收空格
scanf遇到空格、回车和Tab键都会认为输入结束,全部它不能接收空格
fgets用法:
fgets(buf,sizeof(s),stdin):
fgets(buf, n, file) 函数功能:从 目标文件流 file 中读取 n-1 个字符,放入以 buf 起始地址的内存空间中。
楼主的函数调用是这个意思:
首先,s 确定是一个字符数组。
该调用从 标准输入流 stdin (也就是键盘输入)读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中(前提是buf已经申请好空间了)
②一个问答题:
ASK
若是定义了两个字符数组a[10] b[10]
而后连续用两个
fgets(a,11,stdin);
fgets(b,11,stdin);
而后用两个puts依次打印出两个字符数组的内容.
若是第一次输入的时候超过了10个字符(其中没有按回车键).
那么在第一次回车后会显示两个字符串的内容,第一次输入的多于10个的字符保存到了第二个字符数组中。
请问这是为何?fgets不是行缓冲输入吗?
具体例子以下:
#include"stdio.h"
#include"string.h"
void main()
{
char str1[10];
char str2[10];
fgets(str1,11,stdin);
fgets(str2,11,stdin);---------------------------------------------fgets的用法,第一个参数为数组,第二个为数组的大小,第三个网上是这么说的//stdin是标准输入(也就是键盘输入),C标准库里面的一个全局变量
stdin也是FILE*类型的,所以在使用FILE*类型做为参数的地方,可使用stdin//。。。。。。。
printf("%s\n%s\n",str1,str2);
printf("%c\n",str2[0]);
}
输入asdfasdfasdf123
回车后直接输出两组字符串
asdfasdfas
df123
ANSWER
字符串超长,fgets读了size-1个字符尚未读到'\n',就把已经读到的size-1个字符和一个'\0'字符存入字符数组,剩下的字符能够在下次调用fgets时继续读。
输入asdfasdfasdf123,第一次fgets只取走了前10个字符,余下的df123被下一次fgets取走了。
另外,还有两点:
1)包含的是系统头文件,建议用以下形式:
#include
#include
2)你这里fgets中size指定为11,而定义字符数组时,大小却为10,这样会溢出的。 你这里运行没问题是由于字符数组的数组名做参数时被自动转换为字符指针了。