c语言中的fgets函数。
最近看到教材上这样写但看不懂:fgets函数会在结尾存储\n,\0第一次读取后缓存区中会留下换行符,所以需要调用fflush函数刷新缓存区,否则换行符会被存入下一个变量中...
最近看到教材上这样写但看不懂:fgets函数会在结尾存储\n,\0第一次读取后缓存区中会留下换行符,所以需要调用fflush函数刷新缓存区,否则换行符会被存入下一个变量中。既然fgets已经读取了换行符,为什么缓存区中还会留下换行符呢?
教材原话基本上是这样,我在写清楚点哈
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char initial[2]={0};
char name[87]={0};
printf("enter your first initial:");
fgets(initial,sizeof(initial),stdin);
fflush(stdin);
printf("enter your name:");
fgets(name,sizeof(name),stdin);
size_t length=strlen(name);
name[length-1]='\0';
if(initial[0]!=name[0])
printf("\n%s,you got your initial wrong.\n",name);
else
printf("\nHi,%s.Your initial is correct.Well done!\n",name);
system("pause");
return 0;
}
注意,fgets()函数在输入字符串中存储一个换行符来对应按下的回车键。在第一个读取操作中,输入缓存区中会留下一个换行符,所以调用fflush()函数刷新stdin,并删除它,否则,换行符会成为name的输入内容。既然fgets()已经读取了换行符,为什么还会在缓存区中留下呢?如果去掉fflush(),结果确实不对啊。 展开
教材原话基本上是这样,我在写清楚点哈
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char initial[2]={0};
char name[87]={0};
printf("enter your first initial:");
fgets(initial,sizeof(initial),stdin);
fflush(stdin);
printf("enter your name:");
fgets(name,sizeof(name),stdin);
size_t length=strlen(name);
name[length-1]='\0';
if(initial[0]!=name[0])
printf("\n%s,you got your initial wrong.\n",name);
else
printf("\nHi,%s.Your initial is correct.Well done!\n",name);
system("pause");
return 0;
}
注意,fgets()函数在输入字符串中存储一个换行符来对应按下的回车键。在第一个读取操作中,输入缓存区中会留下一个换行符,所以调用fflush()函数刷新stdin,并删除它,否则,换行符会成为name的输入内容。既然fgets()已经读取了换行符,为什么还会在缓存区中留下呢?如果去掉fflush(),结果确实不对啊。 展开
5个回答
展开全部
fgets()函数用于从文件流中读取一行或指定个数的字符,其原型为:
char * fgets(char * string, int size, FILE * stream);
参数说明:
string为一个字符数组,用来保存读取到的字符。
size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'。即,每次最多读取 size-1 个字符。
stream为文件流指针。
【返回值】读取成功,返回读取到的字符串,即string;失败或读到文件结尾返回NULL。因此我们不能直接通过fgets()的返回值来判断函数是否是出错而终止的,应该借助feof()函数或者ferror()函数来判断。
注意:fgets()与gets()不一样,不仅仅是因为gets()函数只有一个参数 FILE *stream,更重要的是,fgets()可以指定最大读取的字符串的个数,杜绝了gets()使用不当造成缓存溢出的问题。
char * fgets(char * string, int size, FILE * stream);
参数说明:
string为一个字符数组,用来保存读取到的字符。
size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'。即,每次最多读取 size-1 个字符。
stream为文件流指针。
【返回值】读取成功,返回读取到的字符串,即string;失败或读到文件结尾返回NULL。因此我们不能直接通过fgets()的返回值来判断函数是否是出错而终止的,应该借助feof()函数或者ferror()函数来判断。
注意:fgets()与gets()不一样,不仅仅是因为gets()函数只有一个参数 FILE *stream,更重要的是,fgets()可以指定最大读取的字符串的个数,杜绝了gets()使用不当造成缓存溢出的问题。
展开全部
好像UNIX里面换行符必须是\n\r两个字符,会不会是fgets在UNIX系统里面运行时只能读取\n,把\r留了下来.
我没用过UNIX,等候高手指正.
我没用过UNIX,等候高手指正.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
哦 这里是特殊情况。
initial这个数组长度只有2, 读进来一个数据就满了(因为第二个位置要写0呢。 所以后面的回车没被读进来,因为缓冲区满了。
initial这个数组长度只有2, 读进来一个数据就满了(因为第二个位置要写0呢。 所以后面的回车没被读进来,因为缓冲区满了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
fgets函数原型如下:
char
*fgets(char
*s,int
n,FILE
*stream);
它一次从文件中读取一行,包括换行符,放入字符串s中,并且加上字符串结束标志符'\\
char
*fgets(char
*s,int
n,FILE
*stream);
它一次从文件中读取一行,包括换行符,放入字符串s中,并且加上字符串结束标志符'\\
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:
fgets(字符数组名,n,文件指针);
其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。
1) 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2) fgets函数也有返回值,其返回值是字符数组的首地址。
fgets(字符数组名,n,文件指针);
其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。
1) 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2) fgets函数也有返回值,其返回值是字符数组的首地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询