我知道这两个功能都可用于输出到控制台 我读了that question,但是在输出到控制台时没有人知道哪个更喜欢使用。 那么哪个功能更好,有什么重大差异吗?
答案 0 :(得分:12)
引用标准(n1570中的7.21.6.3):
printf
函数等同于fprintf
,其中插入了参数stdout
在printf
的参数之前。
因此,当打印到控制台时,printf
更方便,否则没有区别。但是,如果要更改输出目标,fprintf
更容易修改。
答案 1 :(得分:6)
每个进程都有一个名为stdin
的输入流和两个输出流stdout
和stderr
。这些输出流都连接到您的终端,因此以下命令都会将“hello”行打印到您的终端:
printf("hello\n");
fprintf(stdout, "hello\n");
fprintf(stderr, "hello\n");
前两个完全相同,第一个只是更短更方便。第一种是最常用的。
第三个不同之处在于,发送到stderr
的内容在逻辑上与发送到stdout
的内容是分开的。它通常用于您希望用户看到的错误消息。库函数perror
将其错误消息打印到stderr
。
stderr
流在逻辑上分离的重要性在于其内容可以与stdout
分开。例如,假设我们使用命令ls -l
列出文件。
$ touch myfile
$ ls -l myfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
现在,如果我们将ls
的输出重定向到另一个文件,我们会看到以下内容:
$ ls -l myfile > otherfile
$
没有打印输出,因为>
将stdout
流程的ls
流重定向到otherfile
。您可以通过查看otherfile
:
$ cat otherfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
$
但是>
没有重定向stderr
流。您可以通过删除myfile
并重新运行重定向的ls -l
命令来测试它:
$ rm myfile
$ ls -l myfile > otherfile
ls: myfile: No such file or directory
$
因此,您可以看到虽然stdout
被重定向到otherfile
,但stderr
未被重定向,因此其内容出现在终端上。另请注意,otherfile
现在为空,因为ls
命令未找到myfile
,因此无法向stdout
发送任何内容。
也可以重定向stderr
,但这取决于您的shell(控制终端的程序)如何完成。
答案 2 :(得分:2)
如果需要打印到特定输出流,请使用fprintf。
如果您需要显示错误消息,请使用fprintf w / stderr
如果您正在开发命令行可执行文件并且只想向用户显示内容,请使用printf。