【问题标题】:How to define the return type of `getchar()`? [duplicate]如何定义`getchar()`的返回类型? [复制]
【发布时间】:2015-10-14 07:00:46
【问题描述】:

代码如下:

#include <stdio.h>
int main()
{
    char c;
    while((c = getchar()) != EOF) 
    {
        putchar(c);
    }
    return 0;
}

但有人说我应该将char c 更改为int c

谁能告诉我原因?

【问题讨论】:

  • 你应该 RTFM getchar(3) 告诉你 getchar 返回一个 int

标签: c


【解决方案1】:

因为getchar()被定义为:

 int getchar(void);

这应该是足够的理由。原因解释的很好here

如果将 getchar 的返回值分配给 char,则可能出现两种类型的错误/失败。

如果类型 char 是有符号的,并且如果 EOF 被定义(像往常一样)为 -1,则 十进制值为 255 的字符(C 中的“\377”或“\xff”)将是 符号扩展并将比较等于 EOF,过早终止 输入。

如果类型 char 是无符号的,实际的 EOF 值将被截断(通过 丢弃其高阶位,可能导致 255 或 0xff)并且不会被识别为EOF,导致有效 无限输入。

【讨论】:

  • 有些人可能想知道为什么 getchar 被定义为返回int。特别是因为我快速查找重复项,但找不到简单的“getchar 返回什么?”问题。
  • 因为 getchar 只是读取一个字符并返回它,为什么要使用 int ,而不是使用 char
  • 因为EOF 不是char 而是int。这样getchar 可以返回一个负数(“我无法获得一个字符!”)或标准输入上的下一个字符。
  • @BlackMamba:见编辑
【解决方案2】:

getchar 返回EOF 表示文件结束或错误,否则返回unsigned char 转换为int。如果使用char 存储返回值,则无法区分EOF 和某些字符。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多