我可以使用perror()或strerror()打印属于a的"人类可读"错误消息errno,但是如果我还要打印符号名称(例如" EAGAIN")的话errno呢?
任何方便的功能或宏来做到这一点?
更新:附上我最终编写的代码,基于下面接受的答案及其评论的想法:
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
int get_errno_name(char *buf, int buf_size) {
// Using the linux-only gawk instead of awk, because of the convenient
// match() functionality. For Posix portability, use a different recipe...
char cmd[] = "e= && " // errno to be inserted here (max digits = 6)
"echo '#include <errno.h>' | "
"gcc -dM -E - | " // optionally, use …Run Code Online (Sandbox Code Playgroud) 我正在修复一些使用strerror(不是线程安全的)多线程的Linux代码.我发现strerror_r并且strerror_l都是线程安全的.由于不同的定义strerror_r(取决于_GNU_SOURCE它的定义不同)我想使用更新的strerror_l函数,但我应该如何获取locale_t当前语言环境的对象?我没有使用iconv或任何东西,只是简单的libc,我不知道如何获得"默认语言环境"对象(我不关心错误打印的语言,我只想要一个人类可读的字符串. )
我有一个名为 list_6 的嵌套列表:
[[-1, 1, -1, 1, -1, 1, 1, 0, -1, 0, -1, -1, 1, 1, 1, 0, 1, -1, -1, -1 , 1, 1, 1, 0, 0, -1, 0, 0, 0, 1, 0, -1, 1, 1, -1, 0, 0, 1, 1, -1, 0, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1],...]]
列表的每个元素包含-1,1中的整数,并且元素长度不等,列表中有20个元素
我想创建一个名为 list_7 的新列表,如下所示:
[[13],[4],[5],...]],以便对嵌套列表中的每个元素求和,并打印结果。我尝试使用 iter.zip_longest:
[sum(i) for i in itertools.zip_longest(*list_6, fillvalue=0)]
但我得到一个错误函数:
“str”对象不可调用
请解释以下程序中发生的情况.
我检查了strerror(errno)程序开头和结尾返回的地址,并确认每次返回相同的地址.然后一旦确定,在第一种情况下,我继续分配相同的地址ptr,然后复制一个字符串"Hello"到它用strcpy().在案例二,我试图复制"Hello"直接通过返回的地址strerror(errno).我曾奇findings.I'll感激,如果你解释下:
在一个情况下,我复制"Hello"到ptr它是成功的,因为在随后printf(),ptr打印Hello.但是,当我通过了strerror(errno),而不是ptr到printf(),它打印旧的错误message.How是有可能,ptr指向一个消息,但strerror(errno)指向另一个消息时两个地址是一样的吗?我验证了两个地址都是一样的,我希望复制"Hello"到ptr应该与将它复制到返回时相同strerror(errno).为了加倍检查这个差异,然后我试着"Hello"直接复制到strerror(errno)但这次它也不起作用它打印出相同的旧错误字符串.但令人惊讶的是,在这一点上,我再次验证了地址ptr并且strerror(errno)确实一直都是相同的!怎么可能?如果它们是相同的,它们如何指向不同的字符串?"Hello"旧的自定义错误消息的一个和另一个?
请解释一下这背后的原因.
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{ char *ptr;
FILE * fp;
fp = fopen ("missingfile.txt","r");
if (fp == NULL)
printf ("%s\n",strerror(errno));
printf("\n%p",strerror(errno)); //Initial address …Run Code Online (Sandbox Code Playgroud) 如何获取recv()套接字通信recv()返回的错误号或错误字符串,返回-1读取大小,这意味着发生了一些错误.我想知道错误的具体原因.所以我怎么能得到它.