在C语言中,如果没有库函数,如何打印变量的任何字符、字符串或值?

在C语言中,如果没有库函数,如何打印变量的任何字符、字符串或值?,c,printing,printf,character,putchar,C,Printing,Printf,Character,Putchar,例如,如果我不应该使用标准的库函数,如printf(),putchar(),那么如何将字符打印到屏幕上 有没有简单的方法。我对系统调用不太了解,如果我必须使用它们,那么如何使用它们? 因此,任何人都可以建议一种不使用库函数的简单打印方法吗?在linux中,您可以使用write系统调用: write(1, "hello\n", 6); // write hello\n to stdout 如果您无法获得足够的信息,您可以降低一步,以常规方式调用系统调用: syscall(__NR_write,

例如,如果我不应该使用标准的库函数,如
printf()
putchar()
,那么如何将字符打印到屏幕上

有没有简单的方法。我对系统调用不太了解,如果我必须使用它们,那么如何使用它们?
因此,任何人都可以建议一种不使用库函数的简单打印方法吗?

在linux中,您可以使用
write
系统调用:

write(1, "hello\n", 6); // write hello\n to stdout
如果您无法获得足够的信息,您可以降低一步,以常规方式调用系统调用:

syscall(__NR_write, 1, "hello\n", 6);
关于
strace
,您可以使用它查看任何特定程序在运行时使用的系统调用。但请注意,对于“一些简单的解析器”,几乎不需要使用原始系统调用。更好地使用c库的功能


顺便说一下,如果要在Windows中执行上述操作而不使用c标准库,请查找WriteFile和GetStdHandle函数。但不会像linux解决方案那样使用l33t。

在标准C中,您不能。C中定义的唯一I/O是通过C标准库函数

在给定的平台上,可能有以下方法:

  • 直接进行内核调用。为此,您可能需要编写一些内联程序集。您可以直接调用litb的
    write
    调用,而无需使用C库。抓取C库的源代码,看看它是如何完成的
  • 直接写入帧缓冲区。多用户操作系统通常不允许这样做(至少在不进行任何库/内核调用的情况下)

除非您正在编写自己的C库,否则我不知道您为什么要这样做。

好的,谢谢大家的回答。我在问题下方的郝先生的评论中找到了一个简单的答案。他的答案是这样简单的程序 Turbo C(DOS程序):

或者试试这个::)-//Hao(一小时前) 我在TurboC上试过了,效果不错。 我想要这样一个简单的解决方案,我想接受它作为正确的答案,但他(郝)给出了它作为一个评论,所以我把它贴在这里,让其他用户知道这代表他,并接受它。再次感谢郝先生。

C标准库(请参阅)有一组输入和输出例程,用于读取和写入各种输入和输出资源。C标准库通常建立在目标操作系统提供的系统服务和系统调用的基础上,但对于没有操作系统的嵌入式微控制器,则使用不同的方法

除了C标准库之外,还有其他常用库,如POSIX库(请参阅)

我使用资源这个术语是因为输入请求或输出请求的目标可能是各种各样的东西

  • 磁盘上的文件

  • 网络连接

  • 控制台设备

  • 串行通信端口

  • 传感器

  • 打印机

  • 屏幕上的窗口

C标准库采用的模型与Unix操作系统的模型相似,因为所有各种资源都被视为一个设备,从中读取字符流或字节流,然后写入字符流或字节流

在某些情况下,这种抽象允许您忽略资源的物理连接细节。因此,您可以在SATA硬盘、USB拇指驱动器或网络服务器上打开文件。无论打印机位于串行通信端口、USB端口还是网络打印机上,都可以打印到打印机

对于某些类型的资源,例如控制台设备或具有行和列以及可移动光标的打印机,您通常会在写入设备的字符中提供光标定位信息。因此,您将输出要在控制台上打印的文本,以及将光标定位在您要写入的位置的转义码,或者一些其他操作,例如突出显示文本

DEC(参见)的VT100终端就是这样一种控制台设备,它在输出中使用特殊的转义码来执行诸如在屏幕上定位光标之类的操作。这非常方便,Unix、Linux和windows上的控制台窗口使用类似的转义码在控制台或命令窗口上执行类似的操作(请参阅)

C标准库为各种各样的设备提供了一个标准接口,由编写库的人员提供库实际读写所需的底层功能

然而,标准库确实存在字符流的限制,这些字符流是它所使用或呈现给程序员的模型的一部分。这就是为什么还有其他库不是图形用户界面和游戏的C标准库的一部分,例如来自Microsoft、Qt和各种其他组,例如OpenGL(请参见、、和)。也看到

如果要绕过C标准库,直接使用操作系统I/O系统调用或服务,可以这样做。但是,与C标准库不同,C标准库是满足C标准要求的编译器的标准库,操作系统I/O服务因操作系统而异。一些操作系统可能有几种方法来执行相同类型的I/O。例如,Windows有许多不同的方法来执行文件I/O(请参阅)

在某些情况下,您可以绕过操作系统,直接与设备或资源对话。这通常是通过嵌入式应用程序实现的,在许多情况下,对于某些微控制器上的嵌入式应用程序,没有可用的实际操作系统,您必须直接与设备交互

微控制器上的嵌入式应用程序通常使用特定的内存地址与
char far* src = (char far*) 0xB8000000L; 
*src = 'M'; 
src += 2; 
*src = 'D';