【问题标题】:QString() vs sprintf()QString() 与 sprintf()
【发布时间】:2014-11-14 11:57:31
【问题描述】:

我有一些代码,在客户端和服务器之间有一个 TCP 连接。我需要向服务器发送一些 xml 数据并从中接收响应。我正在尝试这样做:

char request[MAX];
sprintf(request, "<attestationRequest><majorVersion>%d</majorVersion><minorVersion>%d</minorVersion></attestationRequest>", major, minor);
write(sockfd,request, length);

while(recv(sockfd, response, MAX, 0) >= 0)
{
    cout << "response " << response;
    //do something;
}   

但是收到的数据是(预期响应+请求)。

如果我尝试使用QString 填充数据,则接收到的数据是正确的。

QString request = QString("<attestationRequest>"
                               "<majorVersion>%1</majorVersion>"
                               "<minorVersion>%2</minorVersion>"
                           "</attestationRequest>")
                            .arg(major)
                            .arg(minor)

这两种情况的其余代码相同。当我使用sprintf 时,我收到了超过 11000 字节的数据,但在使用QString 时收到了 9000 字节。如果我遗漏了什么,我无法理解。

【问题讨论】:

  • sprint 上使用snprintf。这样你就可以确保你不会溢出缓冲区。还存储返回值以了解要发送的字符串的长度,并查看snprintf 是否截断它。
  • 我在这里使用了sprintf,因为我知道请求的大小,我什至分配的比它需要的多。
  • @Shwrtha 您仍应始终使用snprintf。无论如何,您在这里的代码不足以确定问题。 MAXmajorminor 是什么?为什么要使用MAX 来给出请求长度?
  • MAX 为 1000,major = 1,minor = 1
  • 这是一个苹果与橘子的比较。 QString 在所有平台上都是 UTF-16,char* 可以表示任何 8 字节编码。无论哪种方式,都很难从示例代码中知道要做什么,因为它缺少一个相当重要的结束引号。

标签: c++ qt qstring


【解决方案1】:

IMO 两种解决方案都不好。
使用QXmlStreamWriter 更安全、更好。在大多数情况下,对文本的手动操作会以不正确的编码或缺少转义序列或其他 xml 格式违规而告终。

另一个问题是您没有提供任何数据,您是如何进行通信的。很可能是有错误导致您的问题。

【讨论】:

  • 我对这两种情况都使用标准的connect() API。这样的连接没有错误。我试图避免 Qt 依赖。所以,我尝试使用sprintf
【解决方案2】:

您的问题很可能是,UTF-16 数据是通过连接发送的(即 QString。)

如果您尝试了这些命令的 w_char-versions,它可能会成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多