c - 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?
解决方案
第一对事实:
- 该符号
EOF
是一个扩展为整数常量的宏-1
。这个整数常量的类型为int
。 - 如果
char
有符号或无符号,它是实现定义的。不同平台上的相同编译器可能具有不同的char
实现。
现在对您的问题进行详细解释:
当在算术表达式中使用不同大小的整数类型时(并且比较被认为是算术运算符),则表达式的两个操作数都经过通常的算术转换以获得公共类型(通常int
)。
对于较小的整数类型,例如char
,涉及整数提升以将其转换为int
. 对于此促销,char
需要保持不变的价值,因此例如-1
as achar
仍然是-1
as an int
。
由于负数在大多数系统上的表示方式,char
值为-1
(in hexadecimal) 0xff
。对于有符号的char
,当-1
转换为时int
,它会保留该值-1
(将表示为0xffffffff
32 位int
类型)。
问题来了 when char
is unsigned,因为当getchar
返回EOF
(值-1
)时,无符号char
值将等于255
(的无符号十进制表示0xff
)。而当提升为 an 时,int
该值仍然是255
. 而且255 != -1
!
这就是为什么getchar
返回类型是int
而不是char
。这也是为什么所有字符处理函数都使用int
而不是char
.
因此,要解决您的问题,您需要将变量的类型更改c
为int
:
int c;
然后它会工作
推荐阅读
- react-native - 使用本机反应无法检测到用户当前的经纬度
- php - Woocommerce:如何在购物车中只允许一种产品类型?
- lua - 两张表作为一张表的区别
- r - 如何根据给定的索引对向量中的元素进行重新排序
- tcl - 如何从具有行和列的文本文件创建关联数组结构
- html - 当我们使用 flex 调整窗口大小时,自动调整具有适当间隙和宽度的 div
- sql - 我正在尝试直接从 sql server 从 excel 文件中获取记录,但它不起作用
- php - 尝试为具有动态按钮名称的电子商务网站制作结帐页面
- ubuntu - FFMPEG - 合并视频后音频丢失
- python - 如何在python中绘制元组列表?