如何在不使用printf、puts或它们家族中的任何函数的情况下,在C中将内容打印到stderr?

3
有没有一种 C 函数可以在不使用 printf、puts 或它们的相关函数的情况下打印到 stderr?

5
我相信你的问题是:“在不使用C标准库中的任何输出函数的情况下,你能否进行输出?”这将取决于平台,因为你禁止了其他任何方法。同时,这也可能会取决于你所谈论的平台上stderr的确切含义。 - Avi Berger
3
你的动机是什么?这是一个面试问题吗?你的系统缺少printf吗?也许你正在尝试解决一个X-Y问题。 - Jens
@Jens printf 可能是标准库中最大的函数之一,因为解析格式字符串的复杂性。在内存受限的环境中,避免使用它并不罕见。 - Mark Ransom
我记得在理解C语言、C库和底层操作系统方面,当我搞清楚< stdio.h >中的函数与像open和write这样的系统调用有什么关系时,我向前迈了一大步。因此,探究这些区别的教学练习,虽然看起来可能有些人为,但并不一定是个坏主意。 - Steve Summit
4个回答

6

使用普通的标准C,只有你提到的函数可以写入stdoutstderr和从stdin读取。

然而,这些函数是基于UNIX标准输出、错误和输入文件描述符建模的。因此,如果你在像Linux或macOS这样的系统上,则可以使用write系统调用来写入STDERR_FILENOSTDOUT_FILENO(在<unistd.h>头文件中定义)。

当然,Windows也有类似的功能,使用GetStdHandleWriteFile


4
使用系统调用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)));
}

1
几乎。buf[]将包括一个终止的NUL,使用sizeof buf会偏离一个字符,输出NUL字符。更好的方法是使用strlen(buf),或者减去1。 - Jens
@Jens:你说得完全正确,感谢提醒。 - user000001

3

使用 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);

1
您可以使用标准的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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接