NUL手动终止字符串

时间:2019-03-19 05:42:45

标签: 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, &head_s, sizeof(cmd_header_t));
    send_msg(socket_fd, msg, len * sizeof(char));
}

我这样调用该方法:send_err(socket_fd, "»»»»»»»»» illogical REQ request.\0");

套接字已正确设置,并且send_headersend_args方法可以正常工作。

在服务器端,printf可以正常工作,但是strlen不能返回正确的值(它应该是33,但是它给出了{{1} })。

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

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

1 个答案:

答案 0 :(得分:4)

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));
}

正如Alex F在评论中所建议的那样,我的错误在于操纵strlen。我只需要添加一个+1