检查printf的返回值是否重要?

时间:2017-03-21 14:16:49

标签: c

在我的一个大学项目中,我得到了积分,我的教授反馈说我没有处理printf错误。

英文 - > / * ### FB: Error handling printf () is missing * /

/* ### FB: Fehlerbehandlung printf() fehlt */
    printf("%7lu %8lld %10s %3lu %-8s %-8s %8lu %12s  %s %s %s\n",
           sb->st_ino, nblks, permstr, (unsigned long) sb->st_nlink,
           username, groupname, sb->st_size,
           ntime, filename, (symlink ? "->" : ""),
           (symlink ? symlink : "")
           );

我的问题是,始终检查printf函数的返回值并处理错误是否真的很重要?即使我发现错误,我仍会使用fprintf打印到stderr,我必须再次检查fprintf的返回类型。

那么什么时候应该检查返回值,以及如何处理它?<​​/ p>

6 个答案:

答案 0 :(得分:15)

一般来说,您应该始终检查函数的返回值是否有错误。

然而,在printf的情况下,在大多数情况下这样做几乎没有用处。正如您所提到的,如果确实失败了,您可以使用fprintf打印到stderr,但这会引发 检查错误的问题。

如果您没有重定向或重新开启stderr,您可能会遇到同样的问题,在这种情况下它可能并不重要,但如果stderr指向其他地方然后在那里写作可能有价值。您也可以退出流程,但需要确定是否有意义。

您可能想要检查返回值的一个值得注意的时间是,如果要跟踪为了格式化目的而打印的字符数。我在写入日志文件以确定何时滚动日志时使用fprintf完成此操作,但由于printf通常写入交互式控制台(如果它未到期)重定向,你不会知道它,这不会真正适用。

至于你的教授,我唯一的猜测是他希望你养成检查错误的习惯。这是一件好事,但是大多数规则都有例外,这就是其中之一。

答案 1 :(得分:11)

为清楚起见 - printf()返回...

  

printf函数返回传输的字符数,如果发生输出或编码错误则返回负值。 C11§7.21.6.33

检查printf()的返回值为负值pedantic,通常不需要。可以考虑以下情况:

环境限制

printf() "%s" printf()可能超出环境限制,导致fprintf(stderr, ...返回负值。这并不意味着stdout上的后续消息也必须失败。

  

任何单次转换可以产生的字符数至少为4095.C11§7.21.6.115

输出设备较弱。

知道stdout经常在需要检测输出故障的通信接口上重定向的情况。即使屏幕输出取得了非常高的成功,但对于串行(rs232)等各种其他输出流而言并非如此。在这种情况下,stderrstderr可能会以不同方式重定向,因此var app = angular .module('app', ['firebase']) app.factory("Auth", ["$firebaseAuth", function($firebaseAuth) { return $firebaseAuth(); } ]); app.controller("SampleCtrl", ["$scope", "Auth", function($scope, Auth) { $scope.createUser = function() { $scope.message = "One or more field is not correctly entered !"; $scope.error = null; // Create a new user Auth.$createUserWithEmailAndPassword($scope.email, $scope.password) .then(function(firebaseUser) { $scope.message = "User created with email: " + $scope.email + " and ID " + firebaseUser.uid; }).catch(function(error) { $scope.error = error; }); }; $scope.deleteUser = function() { $scope.message = null; $scope.error = null; Auth.$deleteUser().then(function() { $scope.message = "User deleted"; }).catch(function(error) { $scope.error = error; }); }; } ]); 可能仍然可靠。

在任何情况下,如果教授在曲线上评分,可能很多人都会产生相同的负值 - 所以没有年级差异。使用有奇怪要求和期望的客户。

答案 2 :(得分:3)

不检查返回值被视为不良做法。但是如果你通过在函数调用的前面添加(void)来明确表明你忽略了返回值,那么它被认为是干净的:

(void) printf(...);

这表明,您知道有返回值,但您有意忽略它。

答案 3 :(得分:2)

Unix的哲学是stdout(虽然不一定是stderr)应该是可以进一步处理的。编译器和生成器将其用于代码输出。 stdout应该是您的流程产品所在的位置。如果该产品被缩短,您的流程不应该返回EXIT_SUCCESS。 我说要检查这些写入stdout

另一方面,(stderr或多或少是为了方便。如果您正在使用它,那么您可能已经处于错误状态,如果您的错误报告失败,则不会你可以做多少(尽管你仍然应该用返回码发出错误信号)。)

答案 4 :(得分:0)

没有。在现实世界中,与文化 mit einemRuffürPedanterie中的学术练习相反,检查printf()close()的返回值并不重要,或者其他一些事情。如果没有合理的方法对某条信息采取行动,为什么还要费心收集呢?

答案 5 :(得分:0)

如果您正在编写一个使用JSON的应用程序(例如:从数据库读取数据,将数据导出到stdout中),则程序的调用者可能会将输出重定向到文件中。在这种情况下-磁盘可能已满。

问题: 谁会抱怨磁盘已满:shell或您的程序?