C在Raspberry Pi上未检测到EOF

时间:2019-03-15 10:08:20

标签: c gcc raspberry-pi

所以我在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。当我将程序复制到笔记本电脑上并在其中运行时,一切正常。

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

3 个答案:

答案 0 :(得分:3)

第一对事实:

  • 符号EOF是一个宏,它扩展为整数常量-1。此整数常量的类型为int
  • char是带符号的还是无符号的,由实现定义。在不同平台上的同一编译器可能具有不同的char实现。

现在就有关您的问题的详细解释:

在算术表达式中使用大小不同的整数类型(并且比较被视为算术运算符)时,表达式的两个操作数都经过usual arithmetic conversion才能得到一个公共类型(通常为int)。

对于较小的整数类型,例如char,涉及到integer promotion将其转换为int。对于此促销活动,char的值需要保持不变,例如-1作为char将仍然是-1作为int

由于在大多数系统上负数的表示方式,char的{​​{1}}值是(十六进制)-1。对于带符号的0xff,当char转换为-1时,它将保留值int(对于32位,它将表示为-1 0xffffffff类型。

问题出在int unsigned 时,因为然后char返回getchar(值EOF)时,未签名的{{1 }}值将等于-1char的无符号十进制表示形式)。当提升为255时,该值 still 0xff。还有int

这就是getchar返回类型为255而不是255 != -1的原因。这也是所有字符处理函数都使用int而不是char的原因之一。

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

c

然后它将起作用

答案 1 :(得分:2)

getchar返回int值而不是char值。由于您需要某种方式来识别某个getchar函数,如果您阅读常规字符或者如果函数告诉您没有其他内容可供阅读,那么很久以前某人决定使用int,因此某些值大于可以返回char来指示文件结束。将char更改为int

答案 2 :(得分:1)

public ProducerRecord(String topic, Integer partition, K key, V value, Iterable<Header> headers) { this(topic, partition, (Long)null, key, value, headers); } 应该能够返回0到255之间的任何ASCII(和扩展ASCII)字符。

为了区分ascii和EOF,EOF不能是此间隔内的值,因此getchar的返回类型必须具有8位以上。

getchar's return value

所以你应该写

   int getchar(void);