C 手动终止字符串的NUL

C 手动终止字符串的NUL,c,string,C,String,以下是我的服务器端的方法: void send_err(int socket_fd, char *msg) { /// To send an error message (`ERR`). size_t len = strlen(msg); printf("send_err: msg='%s' of size:%zu\n", msg, len); INIT_HEAD_S(head_s, ERR, len); send_header(socket_fd,

以下是我的服务器端的方法:

void send_err(int socket_fd, char *msg) {
    /// To send an error message (`ERR`).

    size_t len = strlen(msg);
    printf("send_err: msg='%s' of size:%zu\n", msg, len);


    INIT_HEAD_S(head_s, ERR, len);
    send_header(socket_fd, &head_s, sizeof(cmd_header_t));
    send_msg(socket_fd, msg, len * sizeof(char));
}
我这样调用该方法:
send_err(socket_fd,»»»»»不合逻辑的请求。\0”)

套接字设置正确,
send_头
send_参数
方法工作正常

在服务器端,
printf
工作正常,但是
strlen
没有返回正确的值(它应该是
33
,但它会发出
43

在客户端,接收到的消息是未定义的:有时会出现奇怪的额外字符。显然,手动添加
\0
似乎并没有在字符串末尾添加NUL字符

我该怎么做我希望该方法不要求此人计算他们发送的字符数,因为这样做很烦人。

void send_err(int socket_fd, char *msg) {
    /// To send an error message (`ERR`).

    size_t len = strlen(msg)+1; // because `strlen` doesn't include the NUL char
    printf("send_err: msg='%s' of size:%zu\n", msg, len);


    INIT_HEAD_S(head_s, ERR, len);
    send_header(socket_fd, &head_s, sizeof(cmd_header_t));
    send_msg(socket_fd, msg, len * sizeof(char));
}

正如评论中所暗示的,我的错误是操纵了strlen。我只需要添加一个
+1

@AlexF我已经发布了我(你)的答案。如果你想发布一个,我会优先接受你的。如果是
\0
,应该拼写为
nul
(1 el),如果是空指针,则拼写为字符和
NULL
/NULL。@PSkocik你是指标题吗?好评论。我改了。