C语言萌新求助fgets函数的问题


#include<stdio.h>

int main(void)
{
char temp[5];

fgets(temp, 5, stdin);
printf("%s", temp);

return 0;
}

vs2017   win10系统
情况1.输入a按下回车,在temp里是'a','\n'和'\0'
情况2.输入a和CTRL+Z,按两下回车,在temp里会有'a','\x1a','\n'和'\0'。

问题1. ctrl+Z不是文件结束符么,为什么在情况2中还会读取‘\n'?
问题2. 为什么在情况2中需要两次回车?
问题3. 我看的一篇文章(http://blog.csdn.net/ccshijtgc/article/details/24033991)中说阻塞式和非阻塞式的区别,我发现ctrl+D和Z都能用,temp中数据也不一样,不同的是在情况2中如果按下的是D,那么按一次回车就可以结束输入,只是输出的时候会有个方框,D和Z为什么会有不一样的效果,并且都是按下回车才结束输入那么应该都是阻塞式?

5 个解决方案

#1


fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。

ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。

#2


可以参考fgets的源代码,就在crt\src\下,

#3


引用 1 楼 cfjtaishan 的回复:
fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。

ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。
 但我windows也能用ctrl+D啊,fgets读取换行符这个我知道,我是不懂为什么在ctrl+Z之后的换行符也能被读取到,不是已经结束了么,而且为什么在情况2下要两次回车才能结束输入呢

#4


引用 3 楼 Dedonkey 的回复:
Quote: 引用 1 楼 cfjtaishan 的回复:

fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。

ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。
 但我windows也能用ctrl+D啊,fgets读取换行符这个我知道,我是不懂为什么在ctrl+Z之后的换行符也能被读取到,不是已经结束了么,而且为什么在情况2下要两次回车才能结束输入呢


fgets遇到EOF或换行才会退出,但是ctrl+d不是windows下的输入EOF。
在Linux下测试结果是输入a然后输入ctrl+d,最终是输出a。
输入a然后输入ctrl+z程序停止运行,并不输出a。
但从你的这几条语句能看出temp中有'\x1a','\n'和'\0'吗?

#5


引用 4 楼 自信男孩的回复:
Quote: 引用 3 楼 Dedonkey 的回复:

Quote: 引用 1 楼 cfjtaishan 的回复:

fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。

ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。
 但我windows也能用ctrl+D啊,fgets读取换行符这个我知道,我是不懂为什么在ctrl+Z之后的换行符也能被读取到,不是已经结束了么,而且为什么在情况2下要两次回车才能结束输入呢


fgets遇到EOF或换行才会退出,但是ctrl+d不是windows下的输入EOF。
在Linux下测试结果是输入a然后输入ctrl+d,最终是输出a。
输入a然后输入ctrl+z程序停止运行,并不输出a。
但从你的这几条语句能看出temp中有'\x1a','\n'和'\0'吗?

用调试监视看能看到数组内容啊,用printf输出的时候就变成a和一段看不见的字符(ctrl+z)或a和方框(ctrl+d)
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告