文本结束符EOF与Ctrl+z的那点事,该如何解决
文本结束符EOF与Ctrl+z的那点事
背景为如下代码(《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前面有其他字符时,当做控制字符用?
------解决思路----------------------
看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。
------解决思路----------------------
vc6.0调试的时候会出现汇编指令,你可以试试
------解决思路----------------------
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对应的汇编并单步执行观察相应内存和寄存器变化。)
背景为如下代码(《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前面有其他字符时,当做控制字符用?
------解决思路----------------------
看一万遍标准、解释、例子、……
不如看一遍对应处理的源代码;
看一万遍对应处理的C源代码
不如单步调试一遍对应处理的源代码;
单步调试一万遍对应处理的C源代码
不如单步调试一遍对应处理的C源代码对应的汇编指令。
------解决思路----------------------
vc6.0调试的时候会出现汇编指令,你可以试试
------解决思路----------------------
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对应的汇编并单步执行观察相应内存和寄存器变化。)