有没有一种 C 函数可以在不使用 printf、puts 或它们的相关函数的情况下打印到 stderr?
使用普通的标准C,只有你提到的函数可以写入stdout
、stderr
和从stdin
读取。
然而,这些函数是基于UNIX标准输出、错误和输入文件描述符建模的。因此,如果你在像Linux或macOS这样的系统上,则可以使用write
系统调用来写入STDERR_FILENO
和STDOUT_FILENO
(在<unistd.h>
头文件中定义)。
当然,Windows也有类似的功能,使用GetStdHandle
和WriteFile
。
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)));
}
buf[]
将包括一个终止的NUL,使用sizeof buf
会偏离一个字符,输出NUL字符。更好的方法是使用strlen(buf),或者减去1。 - Jens使用 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);
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);
printf
可能是标准库中最大的函数之一,因为解析格式字符串的复杂性。在内存受限的环境中,避免使用它并不罕见。 - Mark Ransom