gets与scanf与EOF

一、fgets函数

https://blog.csdn.net/daiyutage/article/details/8540932

二、gets(str)

1. 从stdin流中读取字符串,直至接受到换行符(换行即\n或回车)或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。 中途如果有空格字符,gets仍然把它当成一个字符作为输入字符串的一部分。

2. 返回值,如果读入成功,返回与str相同的指针,如果遇到错误或EOF则返回NULL

3. gets不是安全函数,在linux下fgets才是安全的函数   while(fgets(str,sizeof(str),stdin)!=NULL),fgets会将换行符号一起获取,无需额外输出换行符

三、scanf()

1. 函数返回成功读入的数据项数,读入数据时,如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z (windows)或者Ctrl+d(linux)。

2. while(scanf("%d",&n)!=EOF)  ,既测试输入包含若干测试实例。当N为0时,输入结束,该实例不被处理。

牛客网上算法题目,往往有一句“本题有多组输入数据,输入到文件末尾,请使用while(cin>>)等方式读入”,这样就可以用while(scanf("%d",&n)!=EOF) ,意思是我只要不在命令行中按下ctrl+z之类的结束,我只要输入回车或空格就可以运行一次while循环体。

3. while(scanf("%d",&n)!=EOF)

(1)如果连续在终端中输入2 3 4(空格隔开)然后回车,那么n会被先后赋值为2、3、4,最后n=4.说明scanf遇到空格就结束

(2)如果是scanf("%d%d",&n1,&n2),如果连续在终端中输入2 3 (空格隔开)然后回车,那么n1=2,n2=3,注意如果%d%d如果写为%d,%d,那么输入时,要“2,3”的输入

  (3)  总之,scanf从标准输入流中获取数据,如果输入流有多个数据被空格隔开,而scanf的格式化%d或%s只有一个,那么scanf就会多次并依次地把输入流中的数据按格式赋值。

猜你喜欢

转载自blog.csdn.net/fengel_cs/article/details/114295358