在C语言中,如何不使用printf或puts或它们家族中的任何函数就打印到stderr?

llycmphe  于 2023-02-18  发布在  其他
关注(0)|答案(4)|浏览(138)

有没有一个C函数可以打印到stderr而不使用printf或puts或它们家族中的任何函数?

eimct9ow

eimct9ow1#

使用write系统调用:

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

int main(int argc, char *argv[]) {
   char buf[] = "Hello, world!\n";
   write(2, buf, strnlen(buf,sizeof(buf)));
}
qyswt5oh

qyswt5oh2#

使用stdio.h中的fwrite,它将数组中的数据写入文件:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

该函数允许您指定文件。在您的情况下可以是stderr

char str[] = "This is a string";
fwrite(str, sizeof(char), strlen(str), stderr);
wlp8pajw

wlp8pajw3#

您可以使用标准fwrite()函数并指定stderr作为最后一个参数:

#include <stdio.h>

size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
              FILE *restrict stream);

或者,您可以在符合POSIX的系统上使用write系统调用,并将STDERR_FILENO指定为第一个参数:

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
o4tp2gmn

o4tp2gmn4#

使用普通的标准C,只有您提到的函数可以写入stdoutstderr,并从stdin读取。
但是,这些都是基于UNIX标准的输出、错误和输入文件描述符建模的,因此,如果您使用的是Linux或macOS等系统,则可以使用the write system call写入STDERR_FILENOSTDOUT_FILENO(在the <unistd.h> header file中定义)。
Windows当然也有类似的东西,比如GetStdHandleWriteFile

相关问题