代码之家  ›  专栏  ›  技术社区  ›  maja

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

  •  2
  • maja  · 技术社区  · 11 年前

    网上有很多关于这个练习的问题,但我找不到任何解决方法(也没有任何提示),如何使用“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 回复  |  直到 11 年前
        1
  •  2
  •   mafso    11 年前

    putchar 将其参数转换为 unsigned char 在输出之前(它是一个被写入的字符,而不是十进制转换的结果)。像 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 大到足以容纳该字符串,包括负号和0终止符。)

    如果您卡住了,(非标准) itoa 函数做了类似的事情,查找示例实现可能会给出一些想法。

        2
  •  2
  •   Sunil Bojanapally    11 年前

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

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

        3
  •  1
  •   Gopi    11 年前

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

        4
  •  1
  •   Sourav Ghosh    11 年前

    根据 man page 属于 putchar() ,

    int putchar(int c);

    putchar(c); 相当于 putc(c,stdout) .

    和

    putc() 相当于 fputc() ....... fputc() 写入字符 c ,转换为 unsigned char 到 stream .

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

    因此,如果 EOF 是不可打印的字符[以ASCII格式],您将看不到任何内容[ “不显示任何文本 “]在标准输出上。