我读了那个
int c;
while(c = getchar( ) != EOF)
{
putchar(c);
}
将根据下一个字符是否为EOF打印值0或1。因为!=的优先级高于=。
但是当我在gcc中运行这个程序时,我得到一个看起来像是字符的字符
| 0 0 |
| 0 1 |
输出。
答案 0 :(得分:6)
putchar
打印一个角色。通过打印值0和1,您将打印null和start of heading(SOH)个字符,两个控制字符。您需要将数字0和1转换为可打印的内容,方法是直接从0或1计算可打印值:
while (...) {
// note: the C standard (§ 5.2.1-3 of C99) ensures '0'+1 is '1', which is printable
putchar(c+'0');
}
或使用c
决定要打印的内容。
while (...) {
if (c) {
...
} else {
...
}
// or:
//putchar(c ? ... : ...);
// though feelings on the ternary operator vary.
}
答案 1 :(得分:1)
您正在使用unicode-console。所有不可打印的字符(如值为0和1的字节)将转换为显示其unicode值的2x2矩阵。 (另外,对于没有安装任何字体的所有可打印字符)
答案 2 :(得分:1)
除了大家都说c
是一个不可打印的角色之外,你永远不会为0
打印EOF
,因为你不打算进入在这种情况下循环。循环后你需要额外的putchar
。
答案 3 :(得分:1)
这是你的程序中发生的事情
int c;
为int
预留空间(称之为空格c
)并且不要担心其内容。
while(c = getchar( ) != EOF)
括号中的东西可以写成c = (getchar( ) != EOF)
,因为赋值运算符的优先级低于不等式运算符。
getchar()
等待按键并返回按下的键的值1
1
放入名称为c
的空间。然后,在while循环中
{
putchar(c);
}
您正在打印具有值1的字符。正如您所注意到的,在您的计算机上,值为1的字符在显示时没有漂亮的格式:)
如果您确实要打印具有漂亮格式的值0
或1
,请尝试使用
c = 0; /* or 1 */
putchar('0' + c);
如果要将0到9之间的值打印为字符,请尝试使用
c = 5; /* or 7, or 0, ... */
putchar('0' + c);