文本结束符EOF与Ctrl+z的那点事

C语言 码拜 9年前 (2015-05-11) 1804次浏览 0个评论

背景为如下代码(《c程序设计语言》一书中的一段代码,P29):

for(i=0; i<lim-1 && (c=getchar())!=EOF && c!=””\n””; ++i)
   s[i] = c;
lim位字符数组s[]能容纳的最大元素个数,

DOS窗口下输入:abc
接下来输入文本结束符,
情况1:在字符‘c’后面,直接输入文本结束符,即按Ctrl+z组合键,再按Enter
情况2:在字符‘c’后面先按Enter,接着按Ctrl+z组合键,再按Enter

结果:
情况1下,Ctrl+z当做控制字符处理了,ascii码为26,文本未结束,程序继续等待用户输入;
情况2下,文本流输入结束,Ctrl+z当做文本字结束符处理了,即EOF,值为-1;
说明一下:ascii码1,2,3…26分别对应键盘按键Ctrl+A,Ctrl+B,…,Ctrl+z,这些都是控制字符,如在字符终端输入数据时,按下Ctrl+M组合键,等同于按下回车键。

问题:
1、同一个组合键,两种情况,对应的ascii码不同,怎么解释?
2、可不可以理解为,Ctrl+z单独占用一个文本行时当EOF用,而当在Ctrl+z所在的文本行中,Ctrl+z前面有其他字符时,当做控制字符用?

http://blog.csdn.net/cxyol/archive/2006/03/18/628324.aspx
你看下这篇文章估计就懂了!
好的,我去瞅瞅。
回复等加分。       
VS IDE中,在不明白的符号getchar上点鼠标右键,选转到定义。
引用 4 楼 zhao4zhong1 的回复:

VS IDE中,在不明白的符号getchar上点鼠标右键,选转到定义。

恩,谢谢。

引用 1 楼 pow213 的回复:

http://blog.csdn.net/cxyol/archive/2006/03/18/628324.aspx
你看下这篇文章估计就懂了!

链接已看过了,长知识了,不过好像对EOF、Ctrl+z介绍的不多。
我在c primer plus,第五版,P192找到一种说法:
      要对减胖输入文件尾信号,需要一种键入EOF字符的方式。不,您不能简单地键入字母E、O、F,而且也不能只键入-1(键入-1会传送两个字符:一个连字符和数字1)。正确的方法是您必须知道您系统的要求。在大多数Unix系统上,在一行的开始键入Ctrl+D会导致传送尾信号,许多微型计算机系统将一行的开始位置键入的Ctrl+Z识别为文件尾信号,还有一些则是把任意位置的Ctrl+Z解释成文件尾信号。
很明显,这里的情况因该是第二种第二种情况(上面标红),当Ctrl+z不是在一行的开始位置时,系统就当做控制字符处理,ascii码为26.
还是很感谢。

10分
看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。
引用 7 楼 zhao4zhong1 的回复:

看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。

,谢谢赐教!

引用 7 楼 zhao4zhong1 的回复:

看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。

如果我想单步调式对应处理的C源代码对应的汇编指令,怎么搞?用一个汇编器,把C源代码转为汇编指令吗?求赐教,简单说一下流程。谢谢了。

10分
vc6.0调试的时候会出现汇编指令,你可以试试
20分
引用 9 楼 jusll 的回复:
Quote: 引用 7 楼 zhao4zhong1 的回复:

看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。

如果我想单步调式对应处理的C源代码对应的汇编指令,怎么搞?用一个汇编器,把C源代码转为汇编指令吗?求赐教,简单说一下流程。谢谢了。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

引用 10 楼 gzwgyfgpf 的回复:

vc6.0调试的时候会出现汇编指令,你可以试试

我用Code::Blocks,不过还是有汇编窗口的,跟VC6相似,谢谢。

引用 11 楼 zhao4zhong1 的回复:
Quote: 引用 9 楼 jusll 的回复:
Quote: 引用 7 楼 zhao4zhong1 的回复:

看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。

如果我想单步调式对应处理的C源代码对应的汇编指令,怎么搞?用一个汇编器,把C源代码转为汇编指令吗?求赐教,简单说一下流程。谢谢了。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

谢谢指教!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明文本结束符EOF与Ctrl+z的那点事
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!