perror()或自己的字符串输出到C中的stderr

时间:2016-02-24 08:44:49

标签: c stderr

是否有更好的方法来报告C中的错误?例如,如果应该打开的文件不存在,我应该使用

if( fp == NULL ) 
{
      perror("Error: ");
      return(-1);
}

(从http://www.tutorialspoint.com/c_standard_library/c_function_perror.htm复制)

if( fp == NULL ) 
{
      fprintf(stderr, "Unable to open file for reading.\n");
      return(-1);
}

2 个答案:

答案 0 :(得分:1)

您可以使用perror()或strerror来获取错误消息。如果要推迟显示错误消息或者如果要将消息记录到文件中,则保存errno并使用strerror(),因为perror仅写入标准错误流并且它使用全局errno集和errno如果在打印错误消息之前调用了任何库函数,则可能会随时更改。

使用已保存的errno的示例:

int savederrno;
....
if( fp == NULL ) 
{
  savederrno = errno; /* Save the errno immediately after an api/lib function or a system call */
  /*If you want to write to a log file now, write here using strerror and other library calls */
}

....
/* use strerror function to get the error message and write to log
    or write to std error etc*/

以下手册详细介绍了错误报告。

http://www.gnu.org/software/libc/manual/html_node/Error-Messages.html http://man7.org/linux/man-pages/man3/errno.3.html

答案 1 :(得分:0)

tutorialspoint.com非常糟糕(至少在涉及到C时),因此不得使用。要学习的标准资源是" C编程语言,第2版"作者:Kernighan和Ritchie。

报告内容的首选方法是在邮件中包含失败的功能并使用perror,例如: PERROR("开&#34)

编辑:最初这不包括有关网站声明的任何理由。我觉得这不是必要的,也不是明智的。没有写我可以链接到任何一个。他们的关键是要避开这个网站,所有感兴趣的人都可以很容易地得出结论,最好的问题是最值得怀疑的,最糟糕的是直接错误。

然而,由于我得到一个奇怪的反对,这里有一些摘录:

http://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm

#include <stdio.h>
#include <stdlib.h>

缺少strcpy和strcat的包含。

int main()
{
   char *str;

   /* Initial memory allocation */
   str = (char *) malloc(15);

无需投射malloc。缺少空检查。为什么15?

   strcpy(str, "tutorialspoint");

错误诱导风格。如果长度要改变怎么办?如果确实需要进行显式分配,可以使用strlen()+ 1来获得所需的大小。

   printf("String = %s,  Address = %u\n", str, str);

&#39; U&#39;是指针类型的不正确说明符。

   /* Reallocating memory */
   str = (char *) realloc(str, 25);

标准的坏习语。代码应该使用临时指针从错误中恢复,或者如果恢复不是一个选项,则退出。

   strcat(str, ".com");

为了添加&#34; .com&#34;

,从15到25重新分配的内容是什么?
   printf("String = %s,  Address = %u\n", str, str);

   free(str);

   return(0);
}

这是否证明了我对该网站的主张?