如何在不使用stdio.h或任何其他库头文件的情况下将字符写入C中的标准输出?

kno*_*orv 11 c macos

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

我怎样写一个字符到标准输出,而不使用stdio.h或任何其他标准库文件(即: #include:■允许的)?

或者措辞不同,我如何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;
}
Run Code Online (Sandbox Code Playgroud)

澄清:

  • 请注意:#include不允许.甚至没有一个:-)
  • 该解决方案并没有必须携带(内联汇编因此是OK),但必须在MacOS X的GCC编译

正确答案的定义:

  • 一个工作putchar(char c)功能.没有更多,没有更少:-)

Som*_*ude 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;
}
Run Code Online (Sandbox Code Playgroud)

在Windows上有类似的功能.您可能需要打开控制台OpenFile然后再使用WriteFile.

  • 对我而言,这个问题为生活带来了全新的挑战:开车到下一个城市.**不使用方向盘**.: - } (4认同)
  • 接受有意义的学习挑战,是的.我们大多数人不需要知道如何在没有方向盘的情况下驾驶汽车,就好像方向盘脱落一样,我只需要踩下制动踏板,等待恢复."不使用包含文件"绝对没有意义 - 就像试图(安全地)驾驶没有方向盘的汽车一样毫无意义. (4认同)
  • 是否需要一个头文件来声明`write()`? (2认同)

Oli*_*rth 6

没有与平台无关的方法.

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


mar*_*k4o 5

void putchar(char c) {
  extern long write(int, const char *, unsigned long);
  (void) write(1, &c, 1);
}
Run Code Online (Sandbox Code Playgroud)

  • 他要求实现 `putchar`,因此简单地声明 C 库版本,虽然它可以工作,但不会满足该要求。 (3认同)