fgetsif函数省略第三个参数的第二个参数可以省略吗?谢谢

C语言gets函数,fgets函数的使用
时间: 10:45:22
&&&& 阅读:238
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&  gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取。函数的具体功能如下所示:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为&\0&空字符,并由此来结束字符串。
&&&&&&使用gets函数的时候应注意以下要素:可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) 读取标准输入来替换gets()。为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
&&&&fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加‘\0‘,并以str作为函数值返回。原型是char *fgets(char *s, int n, FILE *stream);
&&&同时注意scanf函数和gets函数混用时的注意事项:
&& 1、gets在scanf前调用,这种调用一般不会出现什么问题,可以正常输入。
&& 2、scanf在gets前调用,这种情况就会出现问题,当输入完scanf中的变量时,运行到gets函数,则不让输入任何字符,出现此问题的原因是gets函数接收了scanf输入完后的回车符,解决的办法是在scanf和gets中间,用getchar函数接收掉回车符,这样就不会出现任何问题了。
&&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/lichongjie/p/4338820.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!函数之间地址值的传递_百度文库TC2.0西fgets函数的问题 — 编程爱好者社区
主题:TC2.0西fgets函数的问题
[专家分:280]
小弟刚学C不久,感觉这个函数有点问题#include&stdio.h&#include&stdlib.h&int&main(int&argc,char&*argv[]){FILE&*char&str[128];if((fp=fopen(argv[1],&r&))==NULL){printf(&Cannot&open&file.\n&);exit(1)}while(!feof(fp)){[color=800000]if(fgets(str,128,fp))printf(&%s&,str);[/color]}fclose(fp);return&0;}我在c盘下有个文本文件1.txt,里面有超过128个汉字,可是这个函数一次可以将这个文件里面的汉字全部读出来,这个是为什么呢?请高手解答一下啊。
本帖地址:&
回复列表 (共13个回复)
[专家分:9360]
while(!feof(fp)){if(fgets(str,128,fp))printf(&%s&,str);}fclose(fp);你不是做了循环了么?当然会读到文件尾了
[专家分:22140]
因为你在不停的用while循环呀。每一次循环读出127个字符,循环到EOF为止。
[专家分:35660]
while(fgets(str,&127,&fp),&!feof(fp))&{&&//&注意://1.&你只能最多读127个字符,还有一个得给结束标志'\0'!//2.&应该先读,再判断是否到了文件末尾!//&&若你一次都不读,如何知道到了末尾?所以应该先读,再验证!//&&若文件中的一行少余你规定的读写量--这里是127,//&&那么fgets会在末尾多加一个'\n'表示读到了行末!//&&相反,若超出了这个数,这个128的数组就装满了127个字符,//&&并且最后一个字符不是'\n'!&&&&puts(str);}当然是使用者的错误了!编译器是有bug,但也少得可怜!
[专家分:22140]
to&sarrow:&&&&你上面说的两点我不同意。&&&&fgets(str,128,fp);没有必要改成fgets(str,127,fp)吧。fgets()中实际读出的正好是第二个参数-1,'\0'会被自动加在后面的。&&&&另外,也没有先读的必要。&&&&while(!feof(fp))&&&{&&&&&&c=fgetc(fp);&&&&&&...&&&}&&&这也完全可以。
[专家分:280]
感谢大家使我茅塞顿开
[专家分:35660]
[quote]fgets()中实际读出的正好是第二个参数-1,'\0'会被自动加在后面的。[/quote]你对,我错![quote]另外,也没有先读的必要。&&&&while(!feof(fp))&&&{&&&&&&c=fgetc(fp);&&&&&&...&&&}&&&这也完全可以。[/quote]我对,你错!2楼主,请记住,别人的话别轻易相信,需要自己实践一下!
[专家分:22140]
to&sarrow:&我想是你错了。&feof判断的是文件指针是否到了末尾。试想,如果一个文件为空,那么此时就应该到了末尾,而你却还要先读一遍,那么读的是什么呢?&我刚才上google搜了一下,教材上也确认了一下,认为我的说法没有错。
[专家分:35660]
[quote]我刚才上google搜了一下,教材上也确认了一下,认为我的说法没有错。[/quote]自己编程实践一下吧![quote]试想,如果一个文件为空,那么此时就应该到了末尾,而你却还要先读一遍,那么读的是什么呢?[/quote]刚刚打开了一个文件,不认为就到了文件结尾!(或者说不知道!)你自己试试用你的方法打开一个空文件,ok?
[专家分:35660]
[quote]教材上也确认了一下[/quote]不知道是什么教材?作者看来是不比较负责的!
[专家分:22140]
to&sarrow:&&我承认空文件是第二次才被确认。但是这并不影响把feof放在最前面,第一次只是判&&&断不出来而已,但是对于程序而言并不影响它的功能。&&&&我查了msdn,里面关于feof给出的唯一一个例子如下:Example//&crt_feof.c/*&This&program&uses&feof&to&indicate&when&*&it&reaches&the&end&of&the&file&CRT_FEOF.TXT.&It&also&*&checks&for&errors&with&ferror.&*/#include&&stdio.h&#include&&stdlib.h&int&main(&void&){&&&int&&count,&total&=&0;&&&char&buffer[100];&&&FILE&*&&&if(&(stream&=&fopen(&&crt_feof.txt&,&&r&&))&==&NULL&)&&&&&&exit(&1&);&&&/*&Cycle&until&end&of&file&reached:&*/&&&while(&!feof(&stream&)&)&&&{&&&&&&/*&Attempt&to&read&in&10&bytes:&*/&&&&&&count&=&fread(&buffer,&sizeof(&char&),&100,&stream&);&&&&&&if(&ferror(&stream&)&)&&&&&&{&&&&&&&&&perror(&&Read&error&&);&&&&&&&&&&&&&&&}&&&&&&/*&Total&up&actual&bytes&read&*/&&&&&&total&+=&&&&}&&&printf(&&Number&of&bytes&read&=&%d\n&,&total&);&&&fclose(&stream&);}&另外,我说的那本书是学校的教材,老谭的c程序设计第三版,上面也是这么写的。&虽然老谭的书错误很多,我不敢说一定正确,但msdn总不会在唯一的一个例子上出现&失误吧。&
您尚未登录,请登录后再回复。1246人阅读
个人(182)
fgets()函数:用于读取文件字符串
头文件:include &stdio.h&
函数说明:fgets()函数用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,知道出现换行符,读到文件尾或是已经读到size-1个字符为止,最后再加上NULL作为字符串结束标志。
gets函数由于没有指定输入字符的大小,如果输入字符大于数组长度时,会产生内存越界,而fgets函数可以根据定义数组的长度自动截取字符,从而消除隐患
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29893次
积分:1696
积分:1696
排名:千里之外
原创:133篇
转载:119篇
(8)(6)(2)(26)(30)(40)(25)(22)(31)(30)(27)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 python函数参数省略 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信