首页| 论坛| 消息

标题:大佬来,QString比较尴尬的地方!
作者:liulin188
日期:2020-04-20 14:29
内容:

发现一个QString比较尴尬的事情:
对于第三方c库中的c函数比如fun(char *p, ...)
如果直接这样去调用
QString s = 来源(是ui->lineEdit->text()或者是其他)
fun(s.toutf8().data())或者直接fun(ui->lineEdit->text().toutf8().data())
这样这个参数实际的内容是可能不确定的,计算结果也可能不对。(是可能,有时候是对的,但是错误也很容易复现!)
如果调用之前这样处理
char buffer[大小] = {0}
sprintf(buffer, s.toutf8().data());(总结发现,用字符串相关的函数没问题,sprintf,strcpy,fprintf都很稳定!)
fun(buffer)
这样调用就很稳定,没问题!
观点:不是说QString有问题,而是说.data()转换后的char *作为参数直接调用第三方c函数,可能存在不稳定性!


#1 [cycloveu 04-20 15:03]
因为QString内部的字符串没有'\0'
#2 [liulin188 04-20 15:11]
@cycloveu
应该不是这个原因,因为在.data()已经转换成'\0'结尾的了。
#3 [spygg 04-20 16:17]
可能是作用域的问题,用个qbytearray中转下再传试试呢
#4 回 spygg 的帖子 [liulin188 04-20 16:42]
spygg:可能是作用域的问题,用个qbytearray中转下再传试试呢 (2020-04-20 16:17) 
对,很有可能,肯定是哪里有问题,但是不知道是哪里的问题。。。。
试了下用QByteArray中转也不行,也就是通过.data()转成的char*作为参数,有隐患!
#5 [liulin188 04-20 16:57]
QString request = ui->request->toPlainText().trimmed();
QByteArray requestData = request.toUtf8();
char *data = requestData.data();
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestData.data());//或者直接data,或者ui->request->toPlainText().trimmed().toUtf8().data()
我还是直接贴代码吧,这是curl库的一个调用,当然其他的c库也会有问题比如aes加密函数,opencv等等。
不管如何转换,只要.data()作为参数传进去,这个内容就是不稳定的。
比如上面我这样写,textedit里一堆文字,服务端可能只收到一个或多个未知字符,也可能收到完整的。
如果通过sprintf处理下,那就稳如狗了,如下!
char curlPostFields[8192] = {0};
snprintf(curlPostFields, sizeof(curlPostFields) - 1, "%s", ui->request->toPlainText().trimmed().toUtf8().data());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, curlPostFields);

<< 1 2 3 >> (1/4)

回复 发表
主题 版块