int c;
while ((c = getchar()) != EOF)
putchar(c);
"此值称为EOF,用于"文件末尾"。我们必须宣布c为 一种足以容纳EOF以及任何可能的char的类型。 因此我们使用int。"
如果我错了,请纠正我:
当我在上述程序中将int
替换为char
时,它似乎按预期工作,但经过一些研究后我发现它并不是因为变量c
不能存储-1 aka EOF
(尽管使用char
)。
我仍然运行它并尝试将其崩溃,我尝试输入负数,如-1但它没有工作。我相信这是因为它被解释为2个不同的字符-
和1
。我根据http://ascii-code.com/尝试了ÿ
,这是与ascii值255对应的字符,
那么上述程序(使用char
而不是int
)会输入什么输入?
(有关信息,我使用的是64位Fedora Linux)
答案 0 :(得分:3)
以前在其他答案中已经对此进行了解释,但有时候找到副本比给出答案更难。
普通char
类型可以是签名或未签名。
函数getchar()
返回EOF或 ...将该字符转换为unsigned
char
转换为int
... (引用{{1}的标准},但它也适用于fgetc()
。
如果你有一个无符号的普通getchar()
类型,那么赋值将生成一个值0..255,然后将其提升为char
以与EOF进行比较,因为没有值0..255是否定的,测试将始终失败 - 并且循环不会停止,直到您通过其他方式终止程序(中断,重新启动......)。
如果你有一个签名的普通int
类型,那么赋值将同时处理一个有效字符(如果使用单字节代码集,则通常为ÿ - U + 00FF,带有DIAERESIS的LATIN SMALL LETTER Y)例如ISO 8859-15)和EOF作为标记EOF,因此循环可能会在某些文件上过早终止。
因此,取决于机器,循环:
char
可以是无限循环,也可以在某些数据文件的EOF之前终止。两者都不是正确的行为 - 这两种行为都不是崩溃。 (问题中的代码不会崩溃。)将char c;
while ((c = getchar()) != EOF)
;
的类型更改为c
可以可靠且可移植地修复这两个问题。
请注意,如果您使用的是UTF-8语言环境,则不会生成十六进制0xFF字节;这不是UTF-8中的有效字节(U + 00FF被编码为UTF-8中的两个字节0xC3 0xBF)。
答案 1 :(得分:-1)
C char
中可能崩溃的原因未指定为签名或未签名。它可以在您的计算机上正常运行,但在其他计算机上可能会失败。
此外,getchar()
函数返回int
值,因此您应使用int
变量来获取此返回值。