在我的一个大学项目中,我得到了积分,我的教授反馈说我没有处理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 : "")
);
Run Code Online (Sandbox Code Playgroud)
我的问题是,始终检查printf函数的返回值并处理错误是否非常重要?即使我发现错误,我仍然会fprintf用来打印stderr,我必须再次检查返回类型fprintf.
那么什么时候应该检查返回值,以及如何处理它?
dbu*_*ush 16
一般来说,您应该始终检查函数的返回值是否有错误.
在的情况下,printf然而,在大多数情况下,这样做没有什么用处.正如您所提到的,如果它确实失败了您可以使用fprintf打印到stderr,但那会引发一个问题,即应该检查错误.
如果你没有重定向或重新打开,stderr你可能会遇到同样的问题,在这种情况下它可能没关系,但如果stderr指向其他地方,那么写那里可能有价值.您也可以退出该过程,但您需要确定这样做是否有意义.
您可能想要检查返回值的一个值得注意的时间是,您是否要跟踪为了格式化目的而打印的字符数.fprintf在写入日志文件以确定何时滚动日志时,我已经这样做了,但由于printf通常写入交互式控制台(如果不是由于重定向,你就不会知道它),那不会真的应用.
至于你的教授,我唯一的猜测是他希望你养成检查错误的习惯.这是一件好事,但是大多数规则都有例外,这就是其中之一.
chu*_*ica 11
为清楚起见 - printf()返回......
该
printf函数返回传输的字符数,如果发生输出或编码错误,则返回负值.C11§7.21.6.33
检查printf()负值的返回值是迂腐的,通常不需要.可以考虑以下情况:
环境限制.
一个单一的printf()与"%s"可能超过环境极限,导致printf()返回一个负值.这并不意味着后续消息fprintf(stderr, ...也必须失败.
任何单次转换可以产生的字符数至少为4095.C11§7.21.6.115
输出设备薄弱.
情况stdout是知道要经常重新定向通过通信接口,其中输出故障需要检测.即使屏幕输出取得了非常高的成功,但对于串行(rs232)等各种其他输出流而言并非如此.在这种情况下stdout,stderr可以不同地重新定向,因此stderr可以保持可靠.
无论如何,如果教授在曲线上评分,很可能会有许多人产生相同的负值 - 所以没有年级差异.使用有奇怪要求和期望的客户.