K&R 1-7 是否可以通过使用 putchar() 而不是 printf 来解决?

K&R 1-7 is it solvable by using putchar() instead of printf?

互联网上有很多关于这个练习的问题,但我找不到关于如何使用 'putchar'.

解决这个练习的任何解决方案(也没有任何提示)
Write a program to print the value of EOF.

我可以很容易地得到一个有效的答案:

printf("%d", EOF);

我想知道是否有使用 'putchar' 的任何已知(或合乎逻辑的)答案(我想这就是练习的全部目的,位于 'getchar' 和 'putchar')

写作:

putchar(EOF);

int c;
c = EOF;
putchar(c);

程序自行启动和关闭,不显示任何文本。

根据 putchar()man page

int putchar(int c);

putchar(c); is equivalent to putc(c,stdout).

putc() is equivalent to fputc() .......fputc() writes the character c, cast to an unsigned char, to stream.

putchar() 应该输出作为参数提供的 ASCII 值的 char 表示。

因此,如果 EOF 的值是不可打印字符 [ASCII],您将不会在标准输出上看到任何 ["without showing any text"]。

EOF 不是可以按预期打印的字符。所以 putchar(EOF) 不打印任何值,因为它只打印 char

因此使用 printf("%d", EOF) 输出整数 -1

putchar(int char) 因此,如果您将 ASCII 值传递给此 API,您会在屏幕上打印相应的字符,但 EOF 的计算结果为 -1,这不是可打印的 ASCII 字符所以你什么也看不到,或者可能看到一些垃圾。

putchar 在输出之前将其参数转换为 unsigned char (这是写入的字符,而不是十进制转换的结果)。由于 EOF 为负,此转换不保值。通常,EOF的值为-1,用8位char,转换后的结果是255,即putchar(EOF)等价于putchar('\xff'),不是可打印字符(假设是 ASCII 系统)。将输出通过管道传输到 hexdump -C 将使输出可见。

不使用 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 可能会导致溢出(实际上几乎每个系统都会发生溢出),另一方面,正数总是可以取反。值 0 可能需要特殊处理。

(或者,可以先将数字转换为字符串,然后再输出。大小为 1 + sizeof(int)*CHAR_BIT/3+1 + 1char 数组足以容纳该字符串,包括减号和 0 -终结者。)

如果您遇到困难,(非标准)itoa 函数会做类似的事情,寻找示例实现可能会提供一些想法。