查看完整版本: [-- 大佬来,QString比较尴尬的地方! --]

QTCN开发网 -> Qt基础编程 -> 大佬来,QString比较尴尬的地方! [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liulin188 2020-04-20 14:29

大佬来,QString比较尴尬的地方!

发现一个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函数,可能存在不稳定性!




cycloveu 2020-04-20 15:03
因为QString内部的字符串没有'\0'

liulin188 2020-04-20 15:11
@cycloveu
应该不是这个原因,因为在.data()已经转换成'\0'结尾的了。

spygg 2020-04-20 16:17
可能是作用域的问题,用个qbytearray中转下再传试试呢

liulin188 2020-04-20 16:42
spygg:可能是作用域的问题,用个qbytearray中转下再传试试呢 (2020-04-20 16:17) 

对,很有可能,肯定是哪里有问题,但是不知道是哪里的问题。。。。
试了下用QByteArray中转也不行,也就是通过.data()转成的char*作为参数,有隐患!

liulin188 2020-04-20 16:57
  1. 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处理下,那就稳如狗了,如下!
  1. char curlPostFields[8192] = {0};
    snprintf(curlPostFields, sizeof(curlPostFields) - 1, "%s", ui->request->toPlainText().trimmed().toUtf8().data());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, curlPostFields);






spygg 2020-04-20 22:39
试试这个...
QString request = ui->request->toPlainText().trimmed();
const auto& bytes = request .toUtf8();
const     char *data = bytes.data();



fsu0413 2020-04-20 22:50
Before version 7.17.0, strings were not copied. Instead the user was forced keep them available until libcurl no longer needed them.

坑在curl这边,你看一下curl的版本

liulin188 2020-04-20 23:40
fsu0413:Before version 7.17.0, strings were not copied. Instead the user was forced keep them available until libcurl no longer needed them.
坑在curl这边,你看一下curl的版本 (2020-04-20 22:50) 

我的是7.37.0,我现在试试你那个方法。
curl应该没问题,因为同样.data()不稳定的问题,我在一个aes加密函数里也出现了。

liulin188 2020-04-20 23:59
spygg:试试这个...
QString request = ui->request->toPlainText().trimmed();
const auto& bytes = request .toUtf8();
const     char *data = bytes.data();
....... (2020-04-20 22:39) 

不行啊

snow_man_0 2020-04-21 00:35
试试用toLocal8Bit()

liulin188 2020-04-21 00:52
snow_man_0:试试用toLocal8Bit() (2020-04-21 00:35) 

不是这里的问题

stlcours 2020-04-21 05:11
QString s = 来源 ? 关键就是这个来源啊

如果使用 QString s = "mydata1\0\mydata2"; 按你的前一种方法,当然有问题。特别是,这个数据如果来自于文件或者其它不可知来源,就更容易出问题。请你告诉我,你的数据来源是什么?

有人说,编程其实就是在对字符串进行编程,事实差不多也是这样,很多很多的功能,我都是通过QString完成的,Qt官方称全世界有300万Qt程序员,我不信这么重要的utf8转换(没有之一!)还会出问题。所以最好你把来龙去脉都讲清楚,让我们帮你看一看。

j695858658 2020-04-21 09:29
stlcours:
QString s = 来源 ? 关键就是这个来源啊
如果使用 QString s = "mydata1\0\mydata2"; 按你的前一种方法,当然有问题。特别是,这个数据如果来自于文件或者其它不可知来源,就更容易出问题。请你告诉我,你的数据来源是什么?
有人说,编程其实就是在对字符串进行编程,事实差不多也是这样,很多很多的功能,我都是通过QString完成的,Qt官方称全世界有300万Qt程序员,我不信这么重要的utf8转换(没有之一!)还会出问题。所以最好你把来龙去脉都讲清楚,让我们帮你看一看。
.......

确实有可能是这样的 QString不能接受含有\0的字符 确实会有问题的。

[attachment=21522]

liulin188 2020-04-21 13:39
stlcours:
QString s = 来源 ? 关键就是这个来源啊
如果使用 QString s = "mydata1\0\mydata2"; 按你的前一种方法,当然有问题。特别是,这个数据如果来自于文件或者其它不可知来源,就更容易出问题。请你告诉我,你的数据来源是什么?
有人说,编程其实就是在对字符串进行编程,事实差不多也是这样,很多很多的功能,我都是通过QString完成的,Qt官方称全世界有300万Qt程序员,我不信这么重要的utf8转换(没有之一!)还会出问题。所以最好你把来龙去脉都讲清楚,让我们帮你看一看。
.......


请看我5楼的代码,来源就是texteidt里的字符(全部是正常的字母数字)
我也没说是tuUtf8有问题,只是说QString转成的char *直接作为参数用于c库函数调用存在不稳定性!

liulin188 2020-04-21 13:39
j695858658:确实有可能是这样的 QString不能接受含有\0的字符 确实会有问题的。
[图片]
 (2020-04-21 09:29) 

看我5楼的代码

goodname 2020-04-21 17:10
qt的用法没问题,同意curl的函数用法和注意事项仔细研究研究。
即使是你换成数组,也只是看起来没问题,实际上用法也未必对。

liulin188 2020-04-21 17:44
goodname:qt的用法没问题,同意curl的函数用法和注意事项仔细研究研究。
即使是你换成数组,也只是看起来没问题,实际上用法也未必对。
 (2020-04-21 17:10) 

对,你说的极有可能是对的,我把范围扩大点去查

liulin188 2020-04-22 15:01
今天回不了帖子啊

liulin188 2021-09-05 23:46
妈的,时隔一年多,这个帖子结帖了,就是作用域的问题


查看完整版本: [-- 大佬来,QString比较尴尬的地方! --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled