我的问题很简单:“为什么第 10 行和第 11 行的代码无法正常运行?”我的代码的预期目的是完全按照原始 K&R 代码的预期进行操作,但每当 (getchar() == '\n') 时都不计算 nc ,请您赐教吗?
稍微修改一下K&R代码:
/** K&R - 1.5.2 Character Counting **/
#include <stdio.h>
/* count characters in input; 1st version */
main(){
long nc;
nc = 0;
while (getchar() != EOF){
if (getchar() != '\n'){
++nc;
}
}
printf("%ld\n", nc);
}
我使用 64 位 Windows 7、CodeBlocks10.05、GNU GCC 编译器。
我目前的进展和理解:
在示例运行中,我输入单词two
然后按 Enter 键,相当于 4 个输入,然后按 ctrl+Z 输入 a^Z
或 EOF 字符。然后程序打印1
。我期待它打印出来3
。我想唯一合乎逻辑的解释是它所做的与我的意图完全相反(它only计算换行符?)。事实证明,如果我输入这个词two
然后按 Enter 键,假设 4 次,它会打印4
。似乎正在数数nc
对于输入的每个换行符,但如果我单独按 Enter 键(在本例中按 4 次),然后按 EOF,它总是打印0
。经过进一步的实验,通过一些看不见的人,4 对于这个程序来说可能是一个神奇的数字。如果我启动它并准确地按 Enter 键(可被 4 整除的数字)次,然后打印 EOF0
。但是,如果我按其他次数输入 EOF 则不会执行任何操作,并且我必须输入^Z
两行,一前一后,正确结束 while 循环,并打印1
。这让我很困惑!
问题是你需要保存其中的值getchar()
– 在一个int
– 因为每次增加计数时您都会读取两个字符。其中之一是 EOF 测试;第二个是换行测试。
int c;
while ((c = getchar()) != EOF)
{
if (c != '\n')
++nc;
}
您需要存储结果的原因getchar()
in an int
而不是一个char
是它可以返回所有可能的char
value 也是一个独特的值 EOF。如果你不使用int
(您直接存储到char
),将会发生以下两种情况之一:
- If
char
是有符号类型,合法字符(通常是 y 元音变音、ÿ、带有分音符号的拉丁文小写字母 Y、U+00FF — 至少在源自拉丁语 1 或 ISO 8859-1 的代码集中)将被解释为等效于 EOF,并且你的程序将提前终止。
- If
char
是无符号类型,任何字符都不会等于 EOF,因此程序永远不会停止循环。
这两种情况都是不可取的。存储返回值getchar()
in an int
防止这两个问题;这是“唯一”(或者至少是最简单)的正确方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)