首页 文章

C编程语言第1章1.5.1中的示例第二次编辑K&R,[复制]

提问于
浏览
-1

这个问题在这里已有答案:

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 回答

  • 3

    它在C char 中可能崩溃的原因未指定为有符号或无符号 . 它可以在你的机器上很好地工作,但在它上面可能会失败 . 并且 getchar() 函数返回 int 值,因此您应该使用 int 变量来获取此返回值 .

  • -1

    之前已在其他答案中对此进行了解释,但有时找到副本比给出答案更难 .

    普通 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,因此循环可能会在某些文件上过早终止 .

    所以,取决于机器,循环:

    char c;
    
    while ((c = getchar()) != EOF)
        ;
    

    可能是无限循环,也可能在某些数据文件的EOF之前终止 . 两者都不是正确的行为 - 这两种行为都不是崩溃 . (问题中的代码不会崩溃 . )将 c 的类型更改为 int 可以可靠且可移植地修复这两个问题 .

    请注意,如果您使用的是UTF-8语言环境,则不会生成十六进制0xFF字节;这不是UTF-8中的有效字节(U 00FF被编码为UTF-8中的两个字节0xC3 0xBF) .

相关问题