越来越感觉到c语言的短小精悍。

有一次要调试一个代码,直接从ftp上下载下来,打开vs就开始调试。无论怎么调试就是不对,单步运行定位错误到一个打开文件的函数。原来是文件没有打开。但是没有具体的错误信息,调试一下子陷入了僵局。记得以前用MFC的时候里面有个函数叫做GetLastError(),可以获取最后出错的原因,如果c语言有就好了。上网搜索了一下果然有这个东西,就叫做errno。errno是定义"error.h"里的错误码,“error.h”定义了一系列的宏来表示相应的错误信息,通过检查errono再在“erro.h”里面查找就能找到相应的出错信息。


from  wikipedia:

errno.h 是C语言C标准库里的头文件,定义了通过错误码来回报错误信息的宏:

  • errno宏定义为一个int型态的左值, 包含任何函数使用errno功能所产生的上一个错误码。
  • 一些表示错误码,定义为整数值的宏:
  • EDOM 源自于函数的参数超出范围,例如sqrt(-1)
  • ERANGE 源自于函数的结果超出范围,例如strtol("0xfffffffff",NULL,0)
  • EILSEQ 源自于不合法的字符顺序,例如wcstombs(str, L"\xffff", 2)

但是一个一个手工查找毕竟麻烦,还好标准库为我们提供了一些函数。

 1 void perror( const char *string );//Print an error message.<stdio.h> or <stdlib.h>
 2 //msdn 示例代码
 3 /* PERROR.C: This program attempts to open a file named
 4  * NOSUCHF.ILE. Because this file probably doesn't exist,
 5  * an error message is displayed. The same message is
 6  * created using perror, strerror, and _strerror.
 7  */
 8
 9 #include <fcntl.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <io.h>
13 #include <stdlib.h>
14 #include <stdio.h>
15 #include <string.h>
16
17 void main( void )
18 {
19    int  fh;
20
21    if( (fh = _open( "NOSUCHF.ILE", _O_RDONLY )) == -1 )
22    {
23       /* Three ways to create error message: */
24       perror( "perror says open failed" );
25       printf( "strerror says open failed: %s\n", strerror( errno ) );
26       printf( _strerror( "_strerror says open failed" ) );
27    }
28    else
29    {
30       printf( "open succeeded on input file\n" );
31       _close( fh );
32    }
33 }
34
35
36 /*Output
37
38 perror says open failed: No such file or directory
39
40 strerror says open failed: No such file or directory
41 _strerror says open failed: No such file or directory*/

上述例子中也出现了另外一个打印错误信息的函数即——strerror

/*strerror, _strerror
Get a system error message (strerror) or prints a user-supplied error message (_strerror).include "string.h"
strerror and _strerror return a pointer to the error-message string. Subsequent calls to strerror or _strerror can overwrite the string.*/
char *strerror( int errnum );
char *_strerror( const char *strErrMsg );


参考网站:

http://zh.wikipedia.org/wiki/Errno.h

http://blog.csdn.net/zljjava/article/details/7767183 介绍了linux下的一些errorno的打印方法,printf("%m", errno);好像在windows下不行

http://www.cnblogs.com/yaohj/archive/2011/01/28/1946817.html介绍了一些具体使用的细节

http://361324767.blog.163.com/blog/static/114902525201251395554338/   perror()的一些注意事项

附录:MSDN 上关于 GetLastError()用法的一个例子:

  

 1 /*GetLastError
 2 This function returns the calling thread’s last-error code value. A remote application interface (RAPI) version of this function exists, and it is named CeGetLastError. */
 3
 4 DWORD GetLastError( void );
 5
 6 /*FormatMessage
 7 This function formats a message string. */
 8
 9 DWORD FormatMessage (
10 DWORD dwFlags,
11 LPCVOID lpSource,
12 DWORD dwMessageId,
13 DWORD dwLanguageId,
14 LPTSTR lpBuffer,
15 DWORD nSize,
16 va_list *Arguments);
17
18
19 //示例用法
20 LPVOID lpMsgBuf;
21 FormatMessage(
22     FORMAT_MESSAGE_ALLOCATE_BUFFER |
23     FORMAT_MESSAGE_FROM_SYSTEM |
24     FORMAT_MESSAGE_IGNORE_INSERTS,
25     NULL,
26     GetLastError(),
27     0, // Default language
28     (LPTSTR) &lpMsgBuf,
29     0,
30     NULL
31 );
32 // Process any inserts in lpMsgBuf.
33 // ...
34 // Display the string.
35 MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
36 // Free the buffer.
37 LocalFree( lpMsgBuf );

2014-05-08  07:56:29

转载于:https://www.cnblogs.com/pasion-forever/p/3715330.html

c语言中的errno相关推荐

  1. c语言里的%p的作用,C语言中geiwei=m%10什么意思,求解!

    C语言中geiwei=m%10什么意思,求解!以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中geiwei=m% ...

  2. 浅析C语言中strtol()函数与strtoul()函数的用法

    这篇文章主要介绍了浅析C语言中strtol()函数与strtoul()函数的用法,注意其将字符串转换成long型的区别,需要的朋友可以参考下 头文件: ? 1 #include <stdlib. ...

  3. c99什么意思_C语言中%c,%s分别代表什么意思?

    www.mh456.com防采集. %c在C语言中代2113表字符5261型格式符. 输入输出的字符串标准类型.这是C语言的格式输出,%c,%s这些代表你要输出的数据的数据类型:%d 十进制有符号整数 ...

  4. c语言中open函数r,C语言中open函数

    语法Open ( windowvar, windowtype {, parent } ) 参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:s ...

  5. c语言 recv_sin,C++_C语言中经socket接收数据的相关函数详解,recv()函数: 头文件:#incl - phpStudy...

    C语言中经socket接收数据的相关函数详解 recv()函数:头文件: #include #include 定义函数: int recv(int s, void *buf, int len, uns ...

  6. C语言中String库函数大全

    C语言中String库函数 以下内容摘自<C程序设计教程>(美)H.M.Deitel P.J.Deitel著,薛万鹏等译,机械工业出版社. void *memccpy (void *des ...

  7. C语言中的rename()和remove()函数的使用及注意点

    C语言中的rename()和remove()函数的使用及注意点 C语言中rename() 和remove()函数属于文件处理函数,其中rename() 对文件或目录进行移动和删除. int ret = ...

  8. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数和getenv()函数的使用详解 C语言putenv()函数:改变或增加环境变量头文件: #include4 定义函数: int putenv(const char * st ...

  9. c语言中open的原理,C语言中open函数

    语法Open ( windowvar, windowtype {, parent } ) 参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:s ...

最新文章

  1. 树莓派/PC实现实时摄像头数据共享(Python—OpenCV)
  2. Hexo Next 博客添加相册瀑布流
  3. 大作文十大必背范文:五星级真题
  4. C#面向对象(一) 封装
  5. oracle sum 数据类型,五、Oracle内置函数
  6. PRML-系列一之1.5.5~1.5.6
  7. .net体系结构——C#高级编程第一章
  8. python的skimage库 图像中值滤波;均值滤波;极大值滤波
  9. Vue 无限滚动加载指令
  10. iOS开发之二维码生成(错误问题小记,微信扫描,长按不识别)
  11. 项目启动会注意事项-甲方
  12. 【解析】.NET中代理服务器WebProxy的各种用法
  13. APM Agent 之 动态注入 agent
  14. [Introduction to programming in Java 笔记] 1.3.8 Gambler's ruin simulation 赌徒破产模拟
  15. 网络安全证书已过期或不可信怎么办
  16. 中级会计 科学计算机,听说中级会计机考系统计算器你还不会使用?还不快点关注...
  17. redis踩坑:redis哨兵开启了保护模式导致主从切换不同步
  18. css-reset样式重置
  19. 天池比赛-金融风控贷款违约预测
  20. 数据网站 免费数据网站

热门文章

  1. 学习spring必须java基础知识-动态代理
  2. 微软面试题系列(三):求子数组的最大和
  3. putty-不输入密码直接登陆
  4. linux配置NFS系统
  5. .NET 4 并行(多核)编程系列之一入门介绍
  6. PHP—使用MYSQL来登陆用户
  7. SQLite指南(4) - FAQ列表(important)
  8. ubuntu12.04循环登录,无法进桌面的问题。
  9. ad采样信噪比与噪声_在AD转换中的过采样和噪声形成
  10. 蓝桥杯 ADV-109 算法提高 征税程序