Sprintf缓冲区Char []尾随null

时间:2013-10-17 02:45:54

标签: c sockets client-server send printf

尝试在客户端上使用sprintf打印出一个保存缓冲区的char []。最后一个字符是'\ 0'。这是我的服务器代码:

char buffer[MAXDATASIZE];
char res[MAXDATASIZE];

memset(buffer, '\0', MAXDATASIZE);
memset(res, '\0', sizeof(res));

if ((numbytes=recv(new_fd, buffer, sizeof(buffer), 0)) == -1) {
        perror("recv");
        exit(true);
}
buffer[numbytes] = '\0'; // add null terminator

sprintf(res, "test \"%s\" not found amongst the batting figures.\n Please check your spelling and try again.", buffer);

if (send(new_fd, res, sizeof(res), 0) == -1){
        perror("send");
}

打印出:测试“term”,然后不打印res []的其余部分(即“在...中找不到”)。我该如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:0)

您可能通过

进行未定义的行为
buffer[numbytes] = '\0'

由于numbytes=recv(new_fd, buffer, sizeof(buffer), 0)可能是sizeof(buffer)buffer[numbytes] = '\0'buffer[sizeof(buffer)]。使用

recv(new_fd, buffer, sizeof(buffer) - 1, 0)

此外,sprintf(res, ...res中的值写入buffer。鉴于格式中的额外文本,可能会出现溢出。推荐

const char format[] = "test \"%s\" not found amongst the batting figures.\n Please check your spelling and try again.";
char res[MAXDATASIZE+sizeof(format)];
sprintf(res, format, buffer);

最后,您可能需要

send(new_fd, res, strlen(res) /* maybe +1 */), 0)