尝试在客户端上使用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 []的其余部分(即“在...中找不到”)。我该如何解决这个问题?
感谢。
答案 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)