本篇记录c语言中error的用法,学习中后面会继续更新

本文介绍了C语言中使用errno和strerror进行错误处理的方法,并通过实例展示了如何在网页中展示错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言中用于保存open函数执行错误代号的变量为errno(error number),每种打开错误都会返回一个错误代号,并且保存在error这个变量中。

如打开文件已存在,error的值为2。其指代的错误为EEXIST          File exists (POSIX.1)

如果想要将errno数值,以其对应的错误解析输出的话,程序需要调用strerror(errno)这个函数。此函数会直接返回errno的错误信息。

将errno以及strerror两者公用之后的效果与perror相同。

用errno可以用于分析所有open失败的情况。

以下参考于http://blog.youkuaiyun.com/jediael_lu/article/details/8589194

   0:Success
   1:Operation not permitted
   2:No such file or directory
   3:No such process
   4:Interrupted system call
   5:Input/output error
   6:No such device or address
   7:Argument list too long
   8:Exec format error
   9:Bad file descriptor
  10:No child processes
  11:Resource temporarily unavailable
  12:Cannot allocate memory
  13:Permission denied
  14:Bad address
  15:Block device required
  16:Device or resource busy
  17:File exists
  18:Invalid cross-device link
  19:No such device
  20:Not a directory
  21:Is a directory
  22:Invalid argument
  23:Too many open files in system
  24:Too many open files
  25:Inappropriate ioctl for device
  26:Text file busy
  27:File too large
  28:No space left on device
  29:Illegal seek
  30:Read-only file system
  31:Too many links
  32:Broken pipe
  33:Numerical argument out of domain
  34:Numerical result out of range
  35:Resource deadlock avoided
  36:File name too long
  37:No locks available
  38:Function not implemented
  39:Directory not empty
  40:Too many levels of symbolic links
  41:Unknown error 41
  42:No message of desired type
  43:Identifier removed
  44:Channel number out of range
  45:Level 2 not synchronized
  46:Level 3 halted
  47:Level 3 reset
  48:Link number out of range
  49:Protocol driver not attached
  50:No CSI structure available
  51:Level 2 halted
  52:Invalid exchange
  53:Invalid request descriptor
  54:Exchange full
  55:No anode
  56:Invalid request code
  57:Invalid slot
  58:Unknown error 58
  59:Bad font file format
  60:Device not a stream
  61:No data available
  62:Timer expired
  63:Out of streams resources
  64:Machine is not on the network
  65:Package not installed
  66:Object is remote
  67:Link has been severed
  68:Advertise error
  69:Srmount error
  70:Communication error on send
  71:Protocol error
  72:Multihop attempted
  73:RFS specific error
  74:Bad message
  75:Value too large for defined data type
  76:Name not unique on network
  77:File descriptor in bad state
  78:Remote address changed
  79:Can not access a needed shared library
  80:Accessing a corrupted shared library
  81:.lib section in a.out corrupted
  82:Attempting to link in too many shared libraries
  83:Cannot exec a shared library directly
  84:Invalid or incomplete multibyte or wide character
  85:Interrupted system call should be restarted
  86:Streams pipe error
  87:Too many users
  88:Socket operation on non-socket
  89:Destination address required
  90:Message too long
  91:Protocol wrong type for socket
  92:Protocol not available
  93:Protocol not supported
  94:Socket type not supported
  95:Operation not supported
  96:Protocol family not supported
  97:Address family not supported by protocol
  98:Address already in use
  99:Cannot assign requested address
 100:Network is down
 101:Network is unreachable
 102:Network dropped connection on reset
 103:Software caused connection abort
 104:Connection reset by peer
 105:No buffer space available
 106:Transport endpoint is already connected
 107:Transport endpoint is not connected
 108:Cannot send after transport endpoint shutdown
 109:Too many references: cannot splice
 110:Connection timed out
 111:Connection refused
 112:Host is down
 113:No route to host
 114:Operation already in progress
 115:Operation now in progress
 116:Stale NFS file handle
 117:Structure needs cleaning
 118:Not a XENIX named type file
 119:No XENIX semaphores available
 120:Is a named type file
 121:Remote I/O error
 122:Disk quota exceeded
 123:No medium found
 124:Wrong medium type
 125:Operation canceled
 126:Required key not available

printf("");


 127:Key has expired
 128:Key has been revoked
 129:Key was rejected by service
 130:Owner died
 131:State not recoverable
 132:Operation not possible due to RF-kill
 133:Unknown error 133
 134:Unknown error 134
 135:Unknown error 135
 136:Unknown error 136
 137:Unknown error 137
 138:Unknown error 138
 139:Unknown error 139

==================================2017/2/24添加==================================

之前学会用errno这个方法之后,就经常把perror替换成printf("%s",strerror(errno));这样的形式,但是有时候要打很长代码的时候又发现很麻烦,又换了过来直接用perror输出,发现errno很累赘,貌似完全可以被perror函数替代。

前几天遇到个问题,我在arm开发板上搭建了一个boa服务器,需要用到cgi编程

在cgi编程的时候发现了一个问题,我的网站需要登陆才能访问,使用过cgi搭建boa网站的人应该知道所有的html标签都是c语言通过printf输出到浏览器,浏览器捕获到这些标记语言显示对应的内容,例如:

printf("<p>Hello, world!</p>",);

可以在网页中输出 "hello world!" 的字样。

但是我要看到我的代码运行到什么位置的时候,就必须要用页面访问的方式,才可以,因为我在页面中加入了html中post获取,如果直接在arm板上运行的话,获取不到post数据就会出现错误没办法正常运行(后来发现这也只是因为post操作之后,没有判断获取的数据如果为NULL的操作才会出现的错误)。

如果用perror输出的话,访问的时候也不会在页面中显示,因为perror是对标准输出文件的输出,但是浏览器并不是ARM开发板的标准输出,错误信息不会显示在浏览器中。

后来我想起了errno。原来errno是用在这种场合

printf('<script>alert("error information:%s")</script>',strerror(errno));

只要这样的话,所有的错误都可以借用script 的alert方法将错误信息以弹框的方式显示出来。如果遇到了用不了调试器,又没办法简单的perror的话,用errno这种方式将数据转换成%s字符串输出,会方便很多!

tips
errno    头文件  errno.h
strerror 头文件  string.h


<think>好的,用户的问题是关于如何在C语言中向线性表添加数据的。首先,我需要回忆一下线性表的基本结构和操作。根据用户提供的引用内容,线性表的结构通常包含一个数组和一个记录长度的变量。比如引用[1]中的结构体定义: ```c #define MAXSIZE 30 struct line { int data[MAXSIZE]; int length; }; ``` 这里,`data`数组存储元素,`length`表示当前线性表的长度。添加数据需要考虑几种情况,比如插入位置是否合法、表是否已满等。用户可能是一个刚学数据结构的新手,所以需要详细解释步骤,并给出示例代码。 接下来,引用[2]提到了`ListInsert_LA`函数,用于在指定位置插入元素。这说明插入操作需要处理位置参数和元素值,并返回状态。常见的错误可能包括位置越界或表满,这些都需要在代码中进行检查。 用户可能想知道具体的实现方法,所以分步骤说明会更清晰。首先,检查插入位置是否在1到length+1之间,然后检查表是否已满。如果没问题,需要将后面的元素依次后移,腾出位置,再插入新元素,并更新长度。 另外,用户可能对数组索引的处理有疑问,比如为什么从0开始,或者为什么插入位置是i-1。需要解释清楚数组下标和逻辑位置的关系。示例代码能帮助用户更好地理解,所以提供一个完整的例子,包括初始化、插入函数和测试主函数会很有帮助。 可能用户还会混淆顺序表和链表,但根据引用中的结构体,这里讨论的是顺序表的实现。因此,不需要涉及链表的动态内存分配,只需操作数组即可。 最后,生成的相关问题需要与插入操作相关,比如错误处理、动态扩容、头尾插入等,这些都是用户可能进一步想了解的内容。确保问题覆盖常见的扩展知识点,帮助用户深入学习。</think>### 在C语言中向线性表添加数据的方法 #### 1. 线性表的结构定义 根据引用[1],线性表通常由存储元素的数组和记录当前长度的变量组成: ```c #define MAXSIZE 30 struct line { int data[MAXSIZE]; // 存储元素的数组 int length; // 当前线性表长度 }; ``` #### 2. 数据添加的核心步骤 引用[2]中提到的`ListInsert_LA`函数展示了插入逻辑,具体实现步骤如下: 1. **参数检查** - 判断插入位置`i`是否合法(要求$1 \leq i \leq length+1$) - 检查线性表是否已满(`length == MAXSIZE`) 2. **元素后移** 将第`i`个位置及之后的元素依次后移一位,腾出插入位置: ```c for(int j = L->length; j >= i; j--) { L->data[j] = L->data[j-1]; } ``` 3. **插入新元素** 在腾出的位置存入新元素`e`: ```c L->data[i-1] = e; ``` 4. **更新表长** `length`自增1表示表长度变化 #### 3. 完整代码示例 ```c #define MAXSIZE 30 #define OK 1 #define ERROR 0 typedef struct { int data[MAXSIZE]; int length; } SeqList; int ListInsert(SeqList *L, int i, int e) { // 判断插入位置合法性 if (i < 1 || i > L->length + 1) { return ERROR; } // 检查表是否已满 if (L->length >= MAXSIZE) { return ERROR; } // 元素后移 for (int j = L->length; j >= i; j--) { L->data[j] = L->data[j-1]; } // 插入新元素 L->data[i-1] = e; L->length++; return OK; } // 使用示例 int main() { SeqList LA = {{10,20,30}, 3}; // 初始表 ListInsert(&LA, 2, 99); // 在第2位插入99 return 0; } ``` #### 4. 关键注意点 - **数组下标转换**:逻辑位置$i$对应数组索引$i-1$(数组从0开始) - **时间复杂度**:最好情况$O(1)$(尾部插入),最坏情况$O(n)$(头部插入) - **空间限制**:固定大小数组需要预先确定最大容量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值