所以我在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?
答案 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 }}值将等于-1
(char
的无符号十进制表示形式)。当提升为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);