关于这项练习在互联网上有很多问题,但是我找不到任何关于如何使用'putchar'来解决这个练习的解决方案(也没有任何提示)。
Write a program to print the value of EOF.
我可以很容易地得到一个有效的答案:
printf("%d", EOF);
我想知道是否有任何使用'putchar'的已知(或逻辑)答案(因为我猜这是练习的全部目的,位于'getchar'和'段落的末尾的putchar')
写作:
putchar(EOF);
或
int c;
c = EOF;
putchar(c);
程序只是启动并关闭而不显示任何文本。
答案 0 :(得分:2)
EOF
不是可以按预期打印的字符。因此putchar(EOF)
不会打印任何值,因为它只打印char
。
因此使用输出整数printf("%d", EOF)
的{{1}}。
答案 1 :(得分:2)
putchar
在输出之前将其参数转换为unsigned char
(并且它是一个写入的字符,而不是十进制转换的结果)。由于EOF
为负数,因此此转化不会保留价值。通常,EOF
的值为-1,位为char
,转换结果为255,即putchar(EOF)
相当于putchar('\xff')
,而不是hexdump -C
可打印的字符(假设是ASCII系统)。将输出管道输出到printf
会使输出可见。
不使用int
和朋友,可以编写输出print a '-' if the value is negative
for every decimal digit, starting from the highest-valued:
convert the digit's value to a character (e.g. 7 should become '7')
try to print the result (with putchar, for example)
if that fails, return an error indicator
的十进制数的函数。基本上,
/
提示:除法和模数运算符%
和'0'
将非常有用。
数字'9'
... '0'
是升序的(并且是连续的);因此,对于从数字值到字符的转换,添加3 + '0'
会产生所需的结果(例如'3'
为INT_MIN
)。
必须注意避免整数溢出,即使像-INT_MIN
这样的极端情况传递给函数。 char
可能会导致溢出(实际上几乎每个系统都会出现溢出),另一方面,正数可能总是被否定。值0可能需要特殊处理。
(或者,可以先将数字转换为字符串然后输出。大小为1 + sizeof(int)*CHAR_BIT/3+1 + 1
的{{1}}数组足以容纳该字符串,包括减号和0终止符。)
如果你遇到困难,(非标准)itoa
函数会做类似的事情,寻找示例实现可能会给出一些想法。
答案 2 :(得分:1)
根据putchar()
的{{3}},
int putchar(int c);
putchar(c);
相当于putc(c,stdout)
。
和
putc()
相当于fputc()
.......fputc()
将字符c
写入unsigned char
,写入{{1} }}
这个stream
应该输出作为它的参数提供的ASCII值的putchar()
表示。
因此,如果char
的值是一个不可打印的字符[以ASCII格式],你就不会看到任何内容["没有显示任何文字&# 34;]关于stdout。
答案 3 :(得分:1)
putchar(int char)
因此,如果您将ASCII值传递给此API,则会在屏幕上显示相应的字符,但EOF
计算结果为-1,这不是可打印的ASCII字符,因此您看不到什么或者可能看到一些垃圾。