首页 > 解决方案 > Raspberry Pi 上的 C 未检测到 EOF

问题描述

所以我在我的 Raspberry Pi Zero 上编写了一个程序来计算输入中不同字长的频率,但程序并没有在 EOF 处停止。

所以我尝试了这个来调试:

#include <stdio.h>
#include <stdlib.h>

void main() {
    char c;
    while ( (c = getchar()) != EOF) {
        putchar(c);
    }
}

并用这个编译:

gcc test.c && ./a.out <input.txt

它打印出输入文本,然后一直打印问号,直到我按下 Ctrl+C。当我将程序复制到我的笔记本电脑上并在那里运行时,一切正常。

我可以在笔记本电脑上完成,但我很好奇。为什么 Pi 无法检测到文件何时到达 EOF?

标签: cgccraspberry-pi

解决方案


第一对事实:

  • 该符号EOF是一个扩展为整数常量的宏-1。这个整数常量的类型为int
  • 如果char有符号或无符号,它是实现定义的。不同平台上的相同编译器可能具有不同的char实现。

现在对您的问题进行详细解释:

当在算术表达式中使用不同大小的整数类型时(并且比较被认为是算术运算符),则表达式的两个操作数都经过通常的算术转换以获得公共类型(通常int)。

对于较小的整数类型,例如char,涉及整数提升以将其转换为int. 对于此促销,char需要保持不变的价值,因此例如-1as achar仍然是-1as an int

由于负数在大多数系统上的表示方式,char值为-1(in hexadecimal) 0xff。对于有符号的char,当-1转换为时int,它会保留该值-1(将表示为0xffffffff32 位int类型)。

问题来了 when charis unsigned,因为当getchar返回EOF(值-1)时,无符号char值将等于255(的无符号十进制表示0xff)。而当提升为 an 时,int该值仍然255. 而且255 != -1

这就是为什么getchar返回类型是int而不是char。这也是为什么所有字符处理函数都使用int而不是char.

因此,要解决您的问题,您需要将变量的类型更改cint

int c;

然后它会工作


推荐阅读