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

时间:2015-01-28 10:12:23

标签: c kernighan-and-ritchie

关于这项练习在互联网上有很多问题,但是我找不到任何关于如何使用'putchar'来解决这个练习的解决方案(也没有任何提示)。

Write a program to print the value of EOF.

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

printf("%d", EOF);

我想知道是否有任何使用'putchar'的已知(或逻辑)答案(因为我猜这是练习的全部目的,位于'getchar'和'段落的末尾的putchar')

写作:

putchar(EOF);

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

程序只是启动并关闭而不显示任何文本。

4 个答案:

答案 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字符,因此您看不到什么或者可能看到一些垃圾。