我读到了
int c;
while(c = getchar() != EOF)
{
putchar(c);
}
将根据下一个字符是否为 EOF 来打印值 0 或 1。因为
!=
的优先级高于 =
。
但是当我在 GCC 中运行这个程序时,我得到一个看起来像这样的字符
|0 0|
|0 1|
作为我按 Enter 时的输出。
putchar
打印一个字符。通过打印值 0 和 1,您将打印 null 和 start of header (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.
}
您正在使用 unicode 控制台。所有不可打印的字符(例如值为 0 和 1 的字节)都会转换为显示其 unicode 值的 2x2 矩阵。 (此外,对于所有未安装字体的可打印字符)
除了每个人都说
c
是不可打印字符之外,无论如何你都不会为 0
打印出 EOF
,因为在这种情况下你不会进入 while 循环。循环后您需要额外的 putchar
。
这就是你的程序中发生的事情
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);