首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

依然没有解决,为什么输入Ctrl+z得到的值为-858993460

2012-07-28 
仍然没有解决,为什么输入Ctrl+z得到的值为-858993460?原来的帖子有人说Ctrl+z不会生成任何值,我也相信了,

仍然没有解决,为什么输入Ctrl+z得到的值为-858993460?
原来的帖子有人说Ctrl+z不会生成任何值,我也相信了,但是经过下列测试,发现不是这么回事。

linux下scanf遇到Ctrl+D会立即停止,这是因为linux下Ctrl+D会终止流,但是Windows下Ctrl+Z并不会终止流,只是终止接收键盘输入,这样Windows下的scanf遇到Ctrl+Z,再按下Enter键不会停止,而是继续要求用户输入,不过只对%c有效,如:
char c;
scanf("%c",&c); //这里有%c,所以scanf还会继续执行,不会终止
假如是%d,如:
scanf("%d",&c); //这里有%d,所以scanf会立即终止
从这个测试发现,Windows下输入Ctrl+z应该可以产生一个值,这个值应该是负值,所以导致%c忽略该值,而%d不能忽略该值,大家看看是不是这个道理?


[解决办法]
流终止如何实现并无标准化,因此windows和linux之间有所不同是正常的。但是,将scanf在windows中输入ctrl+z后能够继续输入说成是流没有结束也有点过火,既然不是标准化的东西,如何才算流结束windows和linux的看法恐怕也不一样。不过,无论如何,有一点是必须做的,就是当操作系统检查到流结束状态时,它必须向C/C++输入输出函数发送一个流结束信号,以使C/C++的输入输出函数产生EOF,这是C/C++标准规定的。

对于scanf在windows中的行为,其实在输入ctrl+z之后,windows的确往行缓冲中放入了一个字符,但这个字符并非楼主所以为的什么负数,而是ASCII码值为0x1A的通常代表EOF的字符,这个现象可以从FILE结构所记录的缓冲区指针指示的缓冲区中找到。scanf接收到这个字符时,将停止输入,其后的字符被忽略,只需输入类似"lksdjf^zskldjfkldj"就能看到这个现象了,^z是ctrl+z。

热点排行
Bad Request.