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