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 + 1
的 char
数组足以容纳该字符串,包括减号和 0 -终结者。)
如果您遇到困难,(非标准)itoa
函数会做类似的事情,寻找示例实现可能会提供一些想法。
互联网上有很多关于这个练习的问题,但我找不到关于如何使用 '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 toputc(c,stdout)
.
和
putc()
is equivalent tofputc()
.......fputc()
writes the characterc
, cast to anunsigned char
, tostream
.
这 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 + 1
的 char
数组足以容纳该字符串,包括减号和 0 -终结者。)
如果您遇到困难,(非标准)itoa
函数会做类似的事情,寻找示例实现可能会提供一些想法。