C语言中的errno(错误报告)用法

C语言标准库中的错误报告用法有三种形式。

1errno

errno在<errno.h>头文件中定义,如下

#ifndef errno
extern int errno;
#endif

外部变量errno保存库程序中实现定义的错误码,通常被定义为errno.h中以E开头的宏,

所有错误码都是正整数,如下例子

# define EDOM   33      /* Math argument out of domain of function.  */

EDOM的意思是参数不在数学函数能接受的域中,稍后的例子中用到了这个宏。

errno的常见用法是在调用库函数之前先清零,随后再进行检查。

2strerror

strerror在<string.h>中定义,如下

__BEGIN_NAMESPACE_STD
/* Return a string describing the meaning of the `errno' code in ERRNUM.  */
extern char *strerror (int __errnum) __THROW;
__END_NAMESPACE_STD

函数strerror返回一个错误消息字符串的指针,其内容是由实现定义的,字符串不能修改,但可以在后续调用strerror函数是覆盖。

3perror

perror在<stdio.h>中定义,如下

__BEGIN_NAMESPACE_STD
/* Print a message describing the meaning of the value of errno.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern void perror (const char *__s);
__END_NAMESPACE_STD

函数perror在标准错误输出流中打印下面的序列:参数字符串s、冒号、空格、包含errno中当前错误码的错误短消息和换行符。在标准C语言中,如果s是NULL指针或NULL字符的指针,则只打印错误短消息,而不打印前面的参数字符串s、冒号及空格。

下面是几个简单的例子

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <math.h>

int main(void)
{
    errno = 0;
    int s = sqrt(-1);
    if (errno) {
        printf("errno = %d\n", errno); // errno = 33
        perror("sqrt failed"); // sqrt failed: Numerical argument out of domain
        printf("error: %s\n", strerror(errno)); // error: Numerical argument out of domain
    }

    return 0;
}

时间: 2024-10-15 23:24:12

C语言中的errno(错误报告)用法的相关文章

GO语言中import的规则和用法

GO语言中引入包使用import,我将在本文讲解下规则和用法. 一些规则: 1.包中不能有main方法. 2.同文件夹中可以直接用方法名调用. 3.main函数建议放在package main里4.main不能调用同个目录下的其它文件中的方法. 5.还可以把包放在上级的目录中,如: /src/myFolder/foo/bar1.go #package foo /src/myFolder/foo/bar2.go #package foo /src/myFolder/foo/bar3.go #pac

C语言中 v...printf类函数的用法

C语言的自学渐渐接近尾声,今天学到了标准库中的stdarg.h头,里面关联了stdio.h头里面的一类函数:v...printf函数,里面举的例子看了之后还是不太明白,google了一下依旧不是很懂,所以自行测试了一下,以下是过程: 这一类函数书中列举了四个,原型分别有: int vfprintf(FILE *restrict stream, const char * restrict format, va_list arg); int vprintf(const char * restrict

[原创]c语言中const与指针的用法

最近一直在准备笔试,补补大一大二欠下的课.复习c语言时碰见这么个题: 1 2 3 4 5 int a=248, b=4; int const c=21; const int *d=&a;  int *const e=&b; int const * const f =&a;  请问下列表达式哪些会被编译器禁止? A:*c=32 B:*d=43 C:e=&a D:f=0x321f E:d=&b F:*e=34 下面逐条分析第一行代码不提, 第二行,int const c

C语言中的strstr函数的用法

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. PHP语言函数 编辑 strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 该函数返回字符串的其余部分(从匹配点).如果未找到所搜索的字符串,则返回 false. 语法 1 strstr(string,search) [1] 参数 描述 string 必需.规定被搜索的字符串. search 必需.规定所搜索的字符串. 提

C语言中mktime函数功能及用法

今天联系写一个日历的程序,需要算出月份中的第一天是星期几,用到了mktime()这个函数,感觉这个函数挺有用的,分享给大家. 原型:time_t mktime(struct tm *) 其中的tm结构体定义如下: struct tm { int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值区间为[0,23] */ int tm_mday; /* 一个月中的日期 - 取值

Objective-C语言中的Block简介以及用法.

Block语法是在iOS4.0的SDK 中开始新增的, 在那时就已经有了超过400多个API使用了Block语法. Block对象又同样是继承与NSObject, 是C语言级别的语法和运行时特性. 和标准的C函数指针类似. 但其除了可执行语句外, 还可以类似对象可以保持状态数据. 和C语言的函数指针类似, 但不完全相同. 常用来作为回调函数使用. Block和函数的操作符对比: 函数指针使用的是 ‘*’ Block使用的是 ‘^’ 下面是例子: apple.h文件 #import <Founda

c语言中static 用法总结(转)

惨痛教训: 假设在test.h中定义了一个static bool g_test=false; 若test1.c和test2.c都包含test.h,则test1.c和test2.c分别生成两份g_test,在test1.c 中置g_test=true,而test2.c中仍然为false并未改变!shit!! 一.c程序存储空间布局 C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令:      2)初始化数据段(数据段

C语言中system()函数的用法总结(转)

system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: 1 #include <sys/types.h> 2 #include <sys/wait.h> 3 #include <errno.h> 4 #include <unistd.h> 5 6 int system(const char * cmdstring) 7 { 8 pid_t pid; 9 int status; 10 11 12 if(cmdstri

汇编语言中&quot;[]&quot;的用法

"[]"的用法在"常见问题"已经有所说明,引用如下: 1.push dword ptr [024c1100] 压栈024c1100值的双字 2.cmp eax,[ebp+14] eax-ebp+14的有效值,不保留值,主要看标志位 3.cmp byte ptr [eax],46 字节型eax-46,看标志位 4.lea eax,[edx-02] 把edx-02的有效值(一个地址值)给eax 5.mov ecx,[edx+08] edx+8值作为地址,此地址所指向的值