gpt4 book ai didi

c - Sprintf 缓冲区 Char[] 尾随 null

转载 作者:太空宇宙 更新时间:2023-11-04 04:47:34 27 4
gpt4 key购买 nike

尝试在客户端上使用 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");
}

这会打印出:test "term"然后不打印 res[] 的其余部分(即“not found among...”)。我该如何解决这个问题?

谢谢。

最佳答案

你可能有未定义的行为

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, ...buffer 中的值写入 res。给定格式中的额外文本,溢出是可能的。建议

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)

关于c - Sprintf 缓冲区 Char[] 尾随 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19417393/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com