【问题标题】:Sprintf buffer Char[] trailing nullSprintf 缓冲区 Char[] 尾随 null
【发布时间】:2013-10-25 09:25:12
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: c sockets client-server send printf


    【解决方案1】:

    你可能有未定义的行为

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多