strerror, strerror_s, strerrorlen_s相关问题

strerror, strerror_s, strerrorlen_s

定义于头文件 <string.h>
(1)char* strerror( int errnum );
(2)errno_t strerror_s( char *buf, rsize_t bufsz, errno_t errnum ); (C11 起)
(3)size_t strerrorlen_s( errno_t errnum ); (C11 起)

(1) 返回指向系统错误码 errnum 的文本表示的指针,它等同于 perror() 会打印的描述。
errnum 通常获得自 errno 对象,不过函数接受任何 int 类型值。字符串的内容是本地 环境限定的。
程序必须不修改返回的字符串,但对 strerror 函数的后继调用可能重写该字符串。不要求 strerror 为线程安全。实现可以返回指向静态只读字符串字面量的不同指针,或反复返回指向静态缓冲区的同一指针, strerror 放置字符串于该缓冲区中。

(2) 同 (1) ,除了将消息复制到用户提供的存储 buf 中。不写入多于 bufsz-1 个字符,缓冲区始终为空终止的。若消息必须被截断,且 bufsz 大于 3 ,则只写入 bufsz-4 个字符,并在空终止符前前附字符 “…” 。另外,在运行时检测下列错误,并调用当前安装的制约处理函数: buf 为空指针
bufsz 为零或大于 RSIZE_MAX

若到 buf 的写入出现在数组末尾后则行为未定义,这在 buf 所指向的缓冲区大小写小于错误消息的字符数,且小于 bufsz 时发生。

(3) 计算若以 errnum 调用则 strerror_s 本会写入的,本地环境限定错误消息的不截断长度。长度不包含空终止符。 同所有边界检查函数, strerror_s, strerrorlen_s 仅若实现定义了 STDC_LIB_EXT1 ,且用户在包含 string.h 前定义 STDC_WANT_LIB_EXT1 为整数常量 1 才保证可用。

参数

errnum - 指代错误码的整数值
buf - 指向用户提供的缓冲区的指针
bufsz - 用户提供的缓冲区的大小

返回值

  1. 指向对应 errno 错误码 errnum 的空终止字节串的指针。

  2. 若整个消息完整存储于 buf 则为零,否则为非零。

  3. strerror_s 会返回的消息长度(不包含空终止符)

注意

POSIX 允许对 strerror 的后继调用非法化先前调用所返回的指针值。它亦指定控制这些消息的 LC_MESSAGES 本地环境平面。

strerror_s 是仅有的允许截断的带边界检查函数,因为提供尽可能多的关于失败的信息被视为更加令人满意。 POSIX 亦为类似目的定义 strerror_r 。

示例

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <locale.h>
 
int main(void)
{
    FILE *fp = fopen(tmpnam((char[L_tmpnam]){0}), "r");
    if(fp==NULL) {
        printf("File opening error: %s\n", strerror(errno));
        setlocale(LC_MESSAGES, "de_DE.utf8");
        printf("Now in German: %s\n", strerror(errno));
#ifdef __STDC_LIB_EXT1__
        setlocale(LC_ALL, "zh_CN.utf8"); // printf 需要多字节输出的 CTYPE
        size_t errmsglen = strerrorlen_s(errno) + 1;
        char errmsg[errmsglen]; 
        strerror_s(errmsg, errmsglen, errno);
        printf("Now in Chinese: %s\n", errmsg);
#endif
    }
}

可能的输出:
File opening error: No such file or directory
Now in German: Datei oder Verzeichnis nicht gefunden
Now in Chinese: 没有那个文件或目录

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <nanomsg/nn.h> #include <nanomsg/reqrep.h> #define SERVER_ADDRESS "tcp://127.0.0.1:5555" // 服务器地址 int main() { int sock = nn_socket(AF_SP, NN_REP); // 创建一个REP类型的socket if (sock < 0) { fprintf(stderr, "nn_socket error: %s\n", nn_strerror(nn_errno())); return -1; } if (nn_bind(sock, SERVER_ADDRESS) < 0) { // 绑定服务器地址 fprintf(stderr, "nn_bind error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("server started, waiting for client...\n"); while (1) { char *buf = NULL; int bytes = nn_recv(sock, &buf, NN_MSG, 0); // 接收客户端请求消息 if (bytes < 0) { fprintf(stderr, "nn_recv error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("server received: %s\n", buf); if (strcmp(buf, "123") == 0) { // 判断客户端请求消息是否为"123" char *response = "abc"; int response_len = strlen(response) + 1; int bytes = nn_send(sock, response, response_len, 0); // 发送回复消息 if (bytes < 0) { fprintf(stderr, "nn_send error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } } else { printf("invalid request\n"); } nn_freemsg(buf); // 释放接收到的消息内存 } nn_close(sock); // 关闭socket return 0; } 以上是一个服务端代码,客户端发送内容“123”服务器回复“abc”,我想要新增当服务端接受到一段json信息为{"module":"1","from":"2","time":"","service":"get_dp_version","args":[]}时,回复客户端一个json为{"module":"2","from":"3","time":"","service":"response_dp_version","data":{"dp_version":"v0.1"}},使用libjansson,json部分单独放在函数里,不要都堆在主函数里
最新发布
06-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江凡心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值