【问题标题】:What does putc() return in c?putc() 在 c 中返回什么?
【发布时间】:2017-12-24 15:54:54
【问题描述】:

我很想知道putc() 会返回什么。我正在通过以下链接:https://www.tutorialspoint.com/c_standard_library/c_function_putc.htm。现在如果putc() 在错误时返回EOF,那么一个自然的问题是它在文件末尾返回什么?为此,我在 dev c++ 中编写了以下内容:

代码

#include <stdio.h>

int main() {
    char ch = EOF;
    printf("%d\n", putc(ch, stdout));
    printf("hello %d", EOF);

    return 0;
} 

输出

255
hello -1

这有点奇怪。谁能帮我吗 ? EOF 不是 What is the ascii value of EOF in c.? 中所述的 ASCII 字符,那么为什么第一行是 255(是的,它不是 ASCII)而第二行是 -1

【问题讨论】:

  • char ch=EOF; EOF 在char 中可能无法表示。这是一些int 常量。
  • 好的,我明白这就是为什么 putc() 的返回类型是 unsigned char ...。但是为什么有 2 个不同的值仍然是一个问题。
  • 返回类型为int此函数在出错时将写入为 unsigned char 转换为 int 或 EOF 的字符返回。 EOF 具有值 -1,这不能是 unsigned char 转换为 int
  • putc 的返回值是int 类型。你在哪里看到是unsigned char
  • 如果您真的想尝试 C 标准库,请认真考虑使用 C 编译器。

标签: c ascii eof non-ascii-characters stdio


【解决方案1】:

来自a putc() manual

fputc()putc()putchar() 将写入为 unsigned char 的字符转换为 int 或 @987654326 @ 错误。

(强调我的)

EOF 是一个int 常量,它不同于任何字符值,因此很自然的选择可能是-1(许多实现都使用它)。

现在,如果您的char签名,则将EOF 转换为char 仍将是-1。但是该函数使用 unsigned char 作为字符,因此它返回 255(这将与解释为 unsigned 的值相同,假设有符号值存储在 2 的补码中并且你的 char 有 8 位)。


只需按照记录的方式使用函数:传递unsigned char 用于打印(字符常量很好)并将返回值作为int。如果返回值不是EOF那么您可以将其解释为unsigned char

【讨论】:

    【解决方案2】:

    EOF 是 -1,因为您可能已经发现了。因此,如果您 putc(EOF,stdout),那么您会在输出中看到 255,因为 -1 在打印之前已转换为 unsigned char

    【讨论】:

    • AFAIK,标准不要求 EOF 的特定值。 -1 只是常用的,因为它必须是不同于unsigned char 等任何字符值的值。
    • @FelixPalmen: EOF 也必须为负数。
    • @vasek:OP 不写putc(EOF,stdout),他写putc(ch, stdout)ch 是一个unsigned char,在他的系统上具有(unsigned char)EOF255 的值。 putc(EOF, stdout) 将具有相同的行为,因为正如您所写,参数被转换为 unsigned char
    • 其实ch被声明为char,因此已签名。
    • @vasek:哎呀,你是对的!但无论如何,参数都会转换为unsigned char。而char 可能默认是无符号的,毕竟这是唯一一致的选择;-)
    【解决方案3】:

    根据 cppreference.com 上的fputc 文档,该字符在内部转换为unsigned char

    在内部,字符在之前转换为无符号字符 正在写。

    如果您现在有一个(可能是签名的)字符,并且您分配了char ch = EOF,并且如果EOF 实际上是-1,则将(char)-1 转换为(unsigned char)-1 得到255,然后通过返回为int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-06
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2021-03-03
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多