14

putchar(char)将字符写入标准输出,通常由stdio.h.

如何在使用stdio.h或任何其他标准库文件的情况下将字符写入标准输出(即:不允许 #include:s)?

putchar(char)或者措辞不同,我如何用零#include语句实现我自己的?

这就是我想要实现的目标:

/* NOTE: No #include:s allowed! :-) */ 

void putchar(char c) {
  /*
   * Correct answer to this question == Code that implements putchar(char).
   * Please note: no #include:s allowed. Not even a single one :-)
   */
}

int main() {
  putchar('H');
  putchar('i');
  putchar('!');
  putchar('\n');
  return 0;
}

说明:

  • 请注意:#include不允许。甚至没有一个:-)
  • 该解决方案不必可移植的(因此内联汇编器是可以的),但它必须在 MacOS X 下使用 gcc 编译。

正确答案的定义:

  • 一个工作putchar(char c)函数。仅此而已,仅此而已:-)
4

4 回答 4

8

在 POSIX 系统上,例如 Linux 或 OSX,您可以使用write系统调用:

/*
#include <unistd.h>
#include <string.h>
*/

int main(int argc, char *argv[])
{
    char str[] = "Hello world\n";

    /* Possible warnings will be encountered here, about implicit declaration
     * of `write` and `strlen`
     */
    write(1, str, strlen(str));
    /* `1` is the standard output file descriptor, a.k.a. `STDOUT_FILENO` */

    return 0;
}

在 Windows 上也有类似的功能。您可能必须使用 打开控制台,OpenFile然后使用WriteFile.

于 2013-01-12T18:02:54.353 回答
7
void putchar(char c) {
  extern long write(int, const char *, unsigned long);
  (void) write(1, &c, 1);
}
于 2013-01-12T18:58:23.137 回答
6

没有独立于平台的方式来做到这一点。

当然,在任何指定的平台上,您都可以通过重新实现/复制和粘贴stdio.h(以及这反过来依赖的任何东西)的实现来轻松实现这一点。但这不会是便携式的。也不会有用。

于 2013-01-12T18:02:31.623 回答
0

由于提供完整的解决方案可能是不合理的,这是下一个最好的事情......这是Apple实施的源代码- 它是开源的。

我认为将其减少到最低限度是 OP 的一项练习。Apple 甚至还提供了一个 XCode 项目文件。

于 2013-01-12T18:39:57.387 回答