• 11767阅读
  • 18回复

求教:QT3中怎么实现QString与char*的转换? [复制链接]

上一主题 下一主题
离线dragonfever
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-20
前帖地址:http://www.qtcn.org/bbs/read.php?tid=36069
主要是QT3下,把QString中的字符串转化,传给字符串char*的问题。。。
比如:
在QT3下,一个QLineEdit类的对象nameLine,将它的text内容传值给const char*型的str,该怎么实现呢?
我在程序中是这样转换的:
QString nameText;
nameText=nameLine->text();
str=nameText.ascii();
编译通过,但是运行时报错显示内存缓冲区溢出,程序终止,详情可查看我的原帖:http://www.qtcn.org/bbs/read.php?tid=36069

网上有很多这方面的帖子,但似乎都不适用我的程序,比如很多人推荐的:
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QString str1 = "Test";
    QByteArray ba = str1.toLatin1();
    const char *c_str2 = ba.data();
    printf("str2: %s", c_str2);
    return app.exec();    
}

我的QT3程序中不能使用data(),不然就会在编译时报错,比如程序中这样转换:
str=nameText.ascii().data()【或str=nameText.latin1().data()】
make后就会有报错信息:
.ui/../teaform.ui.h:44: error: invalid conversion from ‘const char*’ to ‘int’

很是纠结。。。
[/pre]

[ 此帖被dragonfever在2011-04-20 20:34重新编辑 ]
离线wxj120bw

只看该作者 1楼 发表于: 2011-04-21
teaform.ui.h:44 这行代码能贴下吗
离线nanatintin

只看该作者 2楼 发表于: 2011-04-21
不是toLatin1();而是Latin1(),前者是QT4的似乎
离线dragonfever
只看该作者 3楼 发表于: 2011-04-22
回 1楼(wxj120bw) 的帖子
44     str=nameText.ascii();
45     sprintf(sql,"select * from book where BookName='%s';",str);

我后来把第44行换成:str=nameText.latin1()编译时报同样的错误,加.data()也不行

离线dragonfever
只看该作者 4楼 发表于: 2011-04-22
回 2楼(nanatintin) 的帖子
试过latin1(),还是不行。。。
离线wxj120bw

只看该作者 5楼 发表于: 2011-04-22
Re:回 1楼(wxj120bw) 的帖子
引用第3楼dragonfever于2011-04-22 09:19发表的 回 1楼(wxj120bw) 的帖子 :
44     str=nameText.ascii();
45     sprintf(sql,"select * from book where BookName='%s';",str);

我后来把第44行换成:str=nameText.latin1()编译时报同样的错误,加.data()也不行


报的啥错误啊 贴下编译结果 好分析
离线dragonfever
只看该作者 6楼 发表于: 2011-04-22
回 5楼(wxj120bw) 的帖子
这是采用:
44     str=nameText.ascii();
45     sprintf(sql,"select * from book where BookName='%s';",str);

时的报错信息
(原teaform.ui.h文件在附件里)
这时make成功,但是在qvfb运行时,点击okButton时,界面卡死,终端显示下面错误信息:
root@ubuntu:/home/lf/tea0/tea# qvfb&
[1] 19944
root@ubuntu:/home/lf/tea0/tea# Using display 0

root@ubuntu:/home/lf/tea0/tea# ./tea -qws
Connected to VFB server: 240 x 320 x 32
*** buffer overflow detected ***: ./tea terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0x34b390]
/lib/tls/i686/cmov/libc.so.6(+0xe12ca)[0x34a2ca]
/lib/tls/i686/cmov/libc.so.6(+0xe0a08)[0x349a08]
/lib/tls/i686/cmov/libc.so.6(_IO_default_xsputn+0x9e)[0x2d2afe]
/lib/tls/i686/cmov/libc.so.6(_IO_vfprintf+0x10e)[0x2a5d1e]
/lib/tls/i686/cmov/libc.so.6(__vsprintf_chk+0xad)[0x349abd]
/lib/tls/i686/cmov/libc.so.6(__sprintf_chk+0x2d)[0x3499fd]
./tea[0x804caef]
./tea[0x804ce7f]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN7QObject15activate_signalEP15QConnectionListP8QUObject+0x16a)[0xde6f6a]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN7QObject15activate_signalEi+0x88)[0xde90b8]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN7QButton7clickedEv+0x2c)[0xc7d7cc]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN7QButton17mouseReleaseEventEP11QMouseEvent+0x128)[0xe7ee18]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN7QWidget5eventEP6QEvent+0x110)[0xe20fc0]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN12QApplication14internalNotifyEP7QObjectP6QEvent+0xc7)[0xd89c27]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN12QApplication6notifyEP7QObjectP6QEvent+0x235)[0xd8b0e5]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN12QApplication20sendSpontaneousEventEP7QObjectP6QEvent+0x3e)[0xcb906e]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN9QETWidget19translateMouseEventEPK13QWSMouseEventi+0x7e4)[0xcb2314]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN12QApplication15qwsProcessEventEP8QWSEvent+0x8de)[0xcb629e]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN10QEventLoop13processEventsEj+0x1e1)[0xcc2ec1]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN10QEventLoop9enterLoopEv+0x50)[0xda0bb0]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN10QEventLoop4execEv+0x26)[0xda0a36]
/root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3(_ZN12QApplication4execEv+0x1f)[0xd8a27f]
./tea(main+0x96)[0x804bfb6]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x27fbd6]
./tea[0x804be81]
======= Memory map: ========
00110000-00134000 r-xp 00000000 07:00 178872     /lib/tls/i686/cmov/libm-2.11.1.so
00134000-00135000 r--p 00023000 07:00 178872     /lib/tls/i686/cmov/libm-2.11.1.so
00135000-00136000 rw-p 00024000 07:00 178872     /lib/tls/i686/cmov/libm-2.11.1.so
00136000-00138000 r-xp 00000000 07:00 178871     /lib/tls/i686/cmov/libdl-2.11.1.so
00138000-00139000 r--p 00001000 07:00 178871     /lib/tls/i686/cmov/libdl-2.11.1.so
00139000-0013a000 rw-p 00002000 07:00 178871     /lib/tls/i686/cmov/libdl-2.11.1.so
0013a000-0014f000 r-xp 00000000 07:00 178882     /lib/tls/i686/cmov/libpthread-2.11.1.so
0014f000-00150000 r--p 00014000 07:00 178882     /lib/tls/i686/cmov/libpthread-2.11.1.so
00150000-00151000 rw-p 00015000 07:00 178882     /lib/tls/i686/cmov/libpthread-2.11.1.so
00151000-00153000 rw-p 00000000 00:00 0
00153000-00154000 r-xp 00000000 00:00 0          [vdso]
00154000-0023d000 r-xp 00000000 07:02 3765       /usr/lib/libstdc++.so.6.0.13
0023d000-0023e000 ---p 000e9000 07:02 3765       /usr/lib/libstdc++.so.6.0.13
0023e000-00242000 r--p 000e9000 07:02 3765       /usr/lib/libstdc++.so.6.0.13
00242000-00243000 rw-p 000ed000 07:02 3765       /usr/lib/libstdc++.so.6.0.13
00243000-0024a000 rw-p 00000000 00:00 0
0024a000-00267000 r-xp 00000000 07:00 2638       /lib/libgcc_s.so.1
00267000-00268000 r--p 0001c000 07:00 2638       /lib/libgcc_s.so.1
00268000-00269000 rw-p 0001d000 07:00 2638       /lib/libgcc_s.so.1
00269000-003bc000 r-xp 00000000 07:00 178868     /lib/tls/i686/cmov/libc-2.11.1.so
003bc000-003bd000 ---p 00153000 07:00 178868     /lib/tls/i686/cmov/libc-2.11.1.so
003bd000-003bf000 r--p 00153000 07:00 178868     /lib/tls/i686/cmov/libc-2.11.1.so
003bf000-003c0000 rw-p 00155000 07:00 178868     /lib/tls/i686/cmov/libc-2.11.1.so
003c0000-003c3000 rw-p 00000000 00:00 0
00962000-0097d000 r-xp 00000000 07:00 31619      /lib/ld-2.11.1.so
0097d000-0097e000 r--p 0001a000 07:00 31619      /lib/ld-2.11.1.so
0097e000-0097f000 rw-p 0001b000 07:00 31619      /lib/ld-2.11.1.so
00a0a000-00a96000 r-xp 00000000 07:01 663        /home/lf/sqlite_pc/lib/libsqlite3.so.0.8.6
00a96000-00a97000 ---p 0008c000 07:01 663        /home/lf/sqlite_pc/lib/libsqlite3.so.0.8.6
00a97000-00a98000 r--p 0008c000 07:01 663        /home/lf/sqlite_pc/lib/libsqlite3.so.0.8.6
00a98000-00a99000 rw-p 0008d000 07:01 663        /home/lf/sqlite_pc/lib/libsqlite3.so.0.8.6
00a99000-00a9a000 rw-p 00000000 00:00 0
00a9a000-0126b000 r-xp 00000000 07:00 167690     /root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3.3.8
0126b000-012ab000 r--p 007d0000 07:00 167690     /root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3.3.8
012ab000-012b5000 rw-p 00810000 07:00 167690     /root/qt/qt_pc/qt-embedded-free-3.3.8/lib/libqte-mt.so.3.3.8
012b5000-012b8000 rw-p 00000000 00:00 0
08048000-0804e000 r-xp 00000000 07:01 1986       /home/lf/tea0/tea/tea
0804e000-0804f000 r--p 00005000 07:01 1986       /home/lf/tea0/tea/tea
0804f000-08050000 rw-p 00006000 07:01 1986       /home/lf/tea0/tea/tea
0925d000-092c6000 rw-p 00000000 00:00 0          [heap]
b7618000-b7619000 r--p 00000000 07:00 160114     /root/qt/qt_pc/qt-embedded-free-3.3.8/lib/fonts/helvetica_80_50.qpf
b7619000-b761a000 r--p 00000000 07:00 160069     /root/qt/qt_pc/qt-embedded-free-3.3.8/lib/fonts/helvetica_100_50.qpf
b761a000-b762b000 rw-s 00000000 00:04 2654248    /SYSV7200a981 (deleted)
b762b000-b7644000 rw-s 00000000 00:04 2621479    /SYSV6d00a981 (deleted)
b7644000-b7690000 rw-s 00000000 00:04 2588710    /SYSV62004939 (deleted)
b7690000-b76cf000 r--p 00000000 07:02 49888      /usr/lib/locale/zh_CN.utf8/LC_CTYPE
b76cf000-b76d0000 r--p 00000000 07:02 7889       /usr/lib/locale/zh_CN.utf8/LC_NUMERIC
b76d0000-b7822000 r--p 00000000 07:02 49890      /usr/lib/locale/zh_CN.utf8/LC_COLLATE
b7822000-b7824000 rw-p 00000000 00:00 0
b7824000-b7825000 r--p 00000000 07:02 49889      /usr/lib/locale/zh_CN.utf8/LC_TIME
b7825000-b7826000 r--p 00000000 07:02 49891      /usr/lib/locale/zh_CN.utf8/LC_MONETARY
b7826000-b7827000 r--p 00000000 07:02 49893      /usr/lib/locale/zh_CN.utf8/LC_MESSAGES/SYS_LC_MESSAGES
b7827000-b7828000 r--p 00000000 07:02 7734       /usr/lib/locale/zh_CN.utf8/LC_PAPER
b7828000-b7829000 r--p 00000000 07:02 49894      /usr/lib/locale/zh_CN.utf8/LC_NAME
b7829000-b782a000 r--p 00000000 07:02 49895      /usr/lib/locale/zh_CN.utf8/LC_ADDRESS
b782a000-b782b000 r--p 00000000 07:02 49896      /usr/lib/locale/zh_CN.utf8/LC_TELEPHONE
b782b000-b782c000 r--p 00000000 07:02 8200       /usr/lib/locale/zh_CN.utf8/LC_MEASUREMENT
b782c000-b7833000 r--s 00000000 07:02 94900      /usr/lib/gconv/gconv-modules.cache
b7833000-b7834000 r--p 00000000 07:02 49897      /usr/lib/locale/zh_CN.utf8/LC_IDENTIFICATION
b7834000-b7837000 rw-p 00000000 00:00 0
bff8a000-bff9f000 rw-p 00000000 00:00 0          [stack]
已放弃
附件: teaform.ui.h (2 K) 下载次数:1
离线dragonfever
只看该作者 7楼 发表于: 2011-04-22
如果换成:
43     str=nameText.ascii().data();
44     sprintf(sql,"select * from book where BookName='%s';",str);
make时就会报错:
.ui/../teaform.ui.h: In member function ‘virtual void teaform::on_okButtonClicked()’:
.ui/../teaform.ui.h:43: error: request for member ‘data’ in ‘nameText.QString::ascii()’, which is of non-class type ‘const char*’
离线dragonfever
只看该作者 8楼 发表于: 2011-04-22
到底哪里的问题呢?这几天一直在纠结这个。。。
离线wxj120bw

只看该作者 9楼 发表于: 2011-04-22
str=nameText.ascii().data();中的str是怎么定义的 把代码贴下
离线dragonfever
只看该作者 10楼 发表于: 2011-04-24
回 9楼(wxj120bw) 的帖子
多谢楼上关注!
const char *str;
这样定义的,跟不使用.data()时是一样的,它的问题吗?
[ 此帖被dragonfever在2011-04-24 20:51重新编辑 ]
离线wxj120bw

只看该作者 11楼 发表于: 2011-04-26
Re:回 9楼(wxj120bw) 的帖子
引用第10楼dragonfever于2011-04-24 20:51发表的 回 9楼(wxj120bw) 的帖子 :
多谢楼上关注!
const char *str;
这样定义的,跟不使用.data()时是一样的,它的问题吗?

差点晕死了 c字符串赋值要用strcpy只类的函数操作 之所以提示const char*转int这样的错误是把指针地址也就是int转const char*类型的抱错
离线dragonfever
只看该作者 12楼 发表于: 2011-04-26
回 11楼(wxj120bw) 的帖子
醍醐灌顶!多谢楼上!
我在程序中把这个错误改过来了,但是运行时依然提示“段错误
程序源代码粘贴如下:
14 #include "sqlite3.h"
15 void teaform::on_okButtonClicked()
16 {
17 sqlite3* db;
18 char *num,*author,*storage;
19 int rc,nRow,nCol;
20 char **dbResult;
21 char *sql,*errmsg=NULL,*str;
22
23 QString nameText=nameEdit->text();
24 QString resultQString,errMsgQString;

25
26 //open the databse:
27 rc=sqlite3_open("library1.db",&db);
28
29 //open failed:
30 if(rc)
31 {
32     errMsgQString.sprintf("cannot open database: %s\n",sqlite3_errmsg(db));
33     resultEdit->setText(errMsgQString);
34     sqlite3_close(db);
35 }
36
37 //open successed, then do querying:
38 else{
39     strcpy(str,nameText.ascii());
40     sprintf(sql,"select * from book where BookName='%s';",str);

41
42     rc=sqlite3_get_table(db,sql,&dbResult,&nRow,&nCol,&errmsg);
43
44 //get table failed:
45 if(rc!=SQLITE_OK)
46 {
47  resultQString.sprintf("cannot open database: %s\n",errmsg);
48  resultEdit->setText(resultQString);
49  sqlite3_free_table(dbResult);
50  sqlite3_close(db);
51 }
52
53 //get table successfully:
54 else
55 {
56 int j=4;
57 while(j!=8)
58 {
59 switch(j)
60 {
61 case 4: strcpy(num,dbResult[j]);
62 case 5:
63 case 6: strcpy(author,dbResult[j]);
64 case 7: strcpy(storage,dbResult[j]);
65 default: break;
66 }
67 j++;
68 }
69
70 resultQString.sprintf("%s,%s,%s\n",num,author,storage);
71 resultEdit->setText(resultQString);
72 sqlite3_free_table(dbResult);
73 sqlite3_close(db);
74 }
75 }
76 }


make时有警告信息:
.ui/../teaform.ui.h: In member function ‘virtual void teaform::on_okButtonClicked()’:
.ui/../teaform.ui.h:21: warning: ‘str’ may be used uninitialized in this function
.ui/../teaform.ui.h:21: warning: ‘sql’ may be used uninitialized in this function
.ui/../teaform.ui.h:18: warning: ‘num’ may be used uninitialized in this function
.ui/../teaform.ui.h:18: warning: ‘author’ may be used uninitialized in this function
.ui/../teaform.ui.h:18: warning: ‘storage’ may be used uninitialized in this function


大概知道是定义的指针变量方面造成了“段错误”,但不知道该怎么改,希望大家帮我看看,本人C语言知识太贫乏,下面也会多学习。。。
离线dragonfever
只看该作者 13楼 发表于: 2011-04-27
字符串、指针之类的真的很磨人啊,怎么都调不通。。。
离线rebecca904
只看该作者 14楼 发表于: 2011-04-27
QByteArray array = nameLineEdit->text().toLatin1();
char *name = array.data();
上面好像可以把LineEdit里的东西转换到char*.
离线dragonfever
只看该作者 15楼 发表于: 2011-04-27
回 14楼(rebecca904) 的帖子
这个转换我之前也试过,一直没搞好,又试了一次:
29 QByteArray array=nameEdit->text().latin1();
30 char *str=array.data();
但make时报错:
.ui/../teaform.ui.h:29: error: invalid conversion from ‘const char*’ to ‘int’
.ui/../teaform.ui.h:29: error:   initializing argument 1 of ‘QMemArray<type>::QMemArray(int) [with type = char]’
后来,我改成了:
29 const char *str=nameEdit->text().latin1();
make能通过,但运行时,一点okButton,界面还是会卡住,nameEdit的内容还是传不出去,猜想原因还在字符串指针的方面。。。

离线rebecca904
只看该作者 16楼 发表于: 2011-04-28
是nameLineEdit->text().toLatin1(), 不是nameLineEdit->text().latin1().
离线wxj120bw

只看该作者 17楼 发表于: 2011-04-28
const char *str=nameEdit->text().latin1();改成调式下程序,看那行出错。
离线dragonfever
只看该作者 18楼 发表于: 2011-05-06
回 16楼(rebecca904) 的帖子
我之前有尝试使用nameLineEdit->text().toLatin1(),但编译报错说,没有toLatin1()这个成员,后来改成 nameEdit->text().latin1();就能编译通过。。。
快速回复
限100 字节
 
上一个 下一个