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

Dedonkey 2018-03-05 01:38:27
#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为什么会有不一样的效果,并且都是按下回车才结束输入那么应该都是阻塞式?
...全文
321 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dedonkey 2018-03-07
  • 打赏
  • 举报
回复
引用 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下要两次回车才能结束输入呢[/quote] fgets遇到EOF或换行才会退出,但是ctrl+d不是windows下的输入EOF。 在Linux下测试结果是输入a然后输入ctrl+d,最终是输出a。 输入a然后输入ctrl+z程序停止运行,并不输出a。 但从你的这几条语句能看出temp中有'\x1a','\n'和'\0'吗?[/quote] 用调试监视看能看到数组内容啊,用printf输出的时候就变成a和一段看不见的字符(ctrl+z)或a和方框(ctrl+d)
自信男孩 2018-03-06
  • 打赏
  • 举报
回复
引用 3 楼 Dedonkey 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。 ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。
但我windows也能用ctrl+D啊,fgets读取换行符这个我知道,我是不懂为什么在ctrl+Z之后的换行符也能被读取到,不是已经结束了么,而且为什么在情况2下要两次回车才能结束输入呢[/quote] fgets遇到EOF或换行才会退出,但是ctrl+d不是windows下的输入EOF。 在Linux下测试结果是输入a然后输入ctrl+d,最终是输出a。 输入a然后输入ctrl+z程序停止运行,并不输出a。 但从你的这几条语句能看出temp中有'\x1a','\n'和'\0'吗?
Dedonkey 2018-03-05
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。 ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。
但我windows也能用ctrl+D啊,fgets读取换行符这个我知道,我是不懂为什么在ctrl+Z之后的换行符也能被读取到,不是已经结束了么,而且为什么在情况2下要两次回车才能结束输入呢
赵4老师 2018-03-05
  • 打赏
  • 举报
回复
可以参考fgets的源代码,就在crt\src\下,
自信男孩 2018-03-05
  • 打赏
  • 举报
回复
fgets注意的一点是:遇到换行符返回,中间遇到空格不会返回,因此可以理解为行输入。 ctrl+z和ctrl+d是不同系统下输入文件结束符(EOF)的快捷键。ctrl+z是windows的,而ctrl+d是Linux下的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧