是否有更好的方法来报告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);
}
答案 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);
}
这是否证明了我对该网站的主张?