国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Qt一坑】const QString 轉(zhuǎn)換 char * 可能的坑

這篇具有很好參考價值的文章主要介紹了【Qt一坑】const QString 轉(zhuǎn)換 char * 可能的坑。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、遇到的問題

現(xiàn)在有一個這樣的需求,需要將const QString 轉(zhuǎn)換成 ?char *

例如: ?

const QString q_ip = "192.168.1.1";

const char* kc_ip = q_ip.toStdString().c_str(); //單步調(diào)試顯示的結(jié)果可能會是'\0'

char* k_ip = const_cast<char*>(kc_ip);

而當(dāng)我這樣寫時:

std::string str_ip = str.toStdString();

const char* kc_ip = str_ip.c_str();

//kc_ip 是"192.168.1.1" ,printf 輸出也是正常的,不是空

**這是由于:**

str.toStdString().c_str()中toStdString()是一個臨時std::string變量,而c_str()是指向這個臨時std::string變量的字符串地址,所以傳給c時這個臨時std::string變量已經(jīng)被析構(gòu),其內(nèi)容是空,c_str()自然就是'\0'。不過這種情況在未知情況下發(fā)生,有時直接寫QString::toStdString().c_str() 也是好用的。

????????這個函數(shù)返回一個與這個QString內(nèi)容相同的std::string對象。注意這個函數(shù)的返回值是一個對象。

二、查閱其他說明

在 C++ 中,函數(shù)返回對象一般是類似下面的代碼:
?

clazz foo() const { clazz c; c.member = 0; return c; }

clazz foo ( ) const

{

? ? ?clazz c ;

? ? ?c . member = 0 ;

? ? ?return c ;

}

????????注意這里的返回對象,其實(shí)是一個臨時對象。在上面代碼中,雖然我們在函數(shù)體內(nèi)創(chuàng)建了一個clazz的對象c,但返回的并不是“這個”對象,而是由 C++ 創(chuàng)建一個臨時對象,再將這個臨時對象返回。注意這里是“臨時對象”,臨時對象是有生命周期的?!禖++ 程序設(shè)計(jì)語言》第 10 章中寫道,“除非一個臨時對象被約束到某個引用,或者被用于作為命名對象的初始化,否則它將在創(chuàng)建它的那個完整表達(dá)式結(jié)束時銷毀”。所謂“完整表達(dá)式”,是指不是其它表達(dá)式的子表達(dá)式的表達(dá)式。簡單來說,一個完整表達(dá)式的標(biāo)識一般是一個分號。

????????這句看似繞口的話解釋了之前所有的現(xiàn)象。在第一段代碼中,由于函數(shù)返回一個臨時變量,我們立即調(diào)用了這個臨時對象的c_str()函數(shù)。這一切都沒有問題。之后,完整表達(dá)式結(jié)束(遇到分號),而這個臨時變量沒有賦值給某個引用或用于給某個對象初始化,所以這個臨時變量被立即銷毀。由此對象獲得的c_str()函數(shù)結(jié)果同樣被銷毀,因此發(fā)生段錯誤。在第二段代碼中,這個臨時變量用于給sstr對象初始化,我們之后調(diào)用的是這個新的被初始化完成的對象的函數(shù),也就是正常的。第三段代碼雖然也沒有賦值給某個引用或用于給某個對象初始化,但在str.toStdString().c_str()語句結(jié)束后,表達(dá)式并沒有結(jié)束,而是繼續(xù)執(zhí)行函數(shù)調(diào)用。直到函數(shù)調(diào)用返回,才遇到代表表達(dá)式結(jié)束的分號,此時臨時變量才會銷毀。而這時候我們已經(jīng)成功執(zhí)行了函數(shù)代碼。所以一切都沒有問題。

這種看似奇怪的現(xiàn)象其實(shí)只是一個 C++ 語言的陷阱,甚至與 Qt 沒有一點(diǎn)關(guān)系。同樣類似的陷阱還可能發(fā)生在QString::toUtf8()、QString::toAscii()之類的函數(shù)身上,值得注意!文章來源地址http://www.zghlxwxcb.cn/news/detail-599342.html

到了這里,關(guān)于【Qt一坑】const QString 轉(zhuǎn)換 char * 可能的坑的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Qt5】QString的成員函數(shù)chop

    【Qt5】QString的成員函數(shù)chop

    2024年1月19日,周五下午 QString 的 chop 方法用于從字符串的末尾移除指定數(shù)量的字符。這個方法會修改原始字符串,并返回 void。 下面是一個簡單的示例: 在這個示例中,originalString 包含字符串 \\\"Chop me!\\\"。通過調(diào)用 chop(2) 方法,從字符串的末尾移除了兩個字符,修改了原始字符

    2024年01月20日
    瀏覽(52)
  • 【Qt5】QString的成員函數(shù)trimmed

    【Qt5】QString的成員函數(shù)trimmed

    2024年1月19日,周五下午 QString 的 trimmed 方法是用于移除字符串兩端的空白字符(空格、制表符、換行符等)的方法。它返回一個新的字符串,該字符串是原始字符串去除兩端空白后的結(jié)果。 下面是一個簡單的示例: 在這個示例中,originalString 包含前后有空格的字符串。通過

    2024年01月20日
    瀏覽(17)
  • 【Qt】QString怎么判斷是否含有某個字符串

    2023年10月29日,周日晚上 QString怎么判斷是否含有某一字符串? 比如我想知道QString中是否含有\(zhòng)\\"connectToHost error\\\" 要判斷一個 QString 是否包含特定的子字符串,可以使用? QString ?類的? contains() ?方法。 下面是使用? contains() ?方法來判斷一個 QString 是否包含特定子字符串的示例

    2024年02月06日
    瀏覽(35)
  • 【Qt之QString】去除“字符“或替換“字符“小技巧

    去除字符 在Qt中,可以使用以下函數(shù)來去除字符串中的字符。 QString remove(int i, int len) :刪除字符串中從索引位置 i 開始長度為 len 的字符。 QString remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) :刪除字符串中所有與字符 c 相匹配的字符。 cs 參數(shù)指定是否區(qū)分大小寫,默認(rèn)為

    2024年02月07日
    瀏覽(15)
  • C++-QT-QString -CString -string 互轉(zhuǎn)

    C++-QT-QString -CString -string 互轉(zhuǎn)

    網(wǎng)上常用的函數(shù)在環(huán)境(VS2022? ATL包含QT庫的項(xiàng)目)中轉(zhuǎn)換不了。 std::string str = qstr.toStdString(); //不行 問題: ? QString qsrc = \\\"asjdoag\\\"; string sdest; sdest = qsrc.toStdString();? 不行 ? 3.1包含目錄和庫目錄 3.2 頭文件和庫文件 示例代碼: https://download.csdn.net/download/aggie4628/88778435 ?

    2024年01月25日
    瀏覽(17)
  • QT Creator上位機(jī)學(xué)習(xí)(三)QString及其相關(guān)控件介紹

    QT Creator上位機(jī)學(xué)習(xí)(三)QString及其相關(guān)控件介紹

    QSting類,用于處理字符串,進(jìn)行字符串和數(shù)字之間的轉(zhuǎn)化 轉(zhuǎn)換函數(shù): 1.數(shù)字轉(zhuǎn)字符串 其中setNum() 函數(shù)和number()函數(shù)使用了多個重載定義,可以處理各種類型的整數(shù)和浮點(diǎn)數(shù),處理整數(shù)的時候還可以指定進(jìn)制。 例如:數(shù)據(jù)轉(zhuǎn)化為指定進(jìn)制的字符串 2.字符串轉(zhuǎn)數(shù)字 轉(zhuǎn)換為整數(shù):

    2024年02月11日
    瀏覽(18)
  • Qt解析含顏色的QString字符串顯示到控件

    Qt解析含顏色的QString字符串顯示到控件

    1、需求 開發(fā)接收含顏色字符串顯示到窗口,可解析字符串顏色配置窗口屬性,且分割字符串顯示。 mprintf(“xxxxxx”);打印的xxxxxx含有顏色配置。 2、實(shí)現(xiàn)方法 2.1、條件 選用Qt的PlainTextEdit控件顯示字符串,配置為只讀模式 初始化串口成功后,用下列代碼綁定串口信號,收到

    2024年01月25日
    瀏覽(17)
  • VS2019+QT5.12.9環(huán)境下,調(diào)試QString無顯示解決

    VS2019+QT5.12.9環(huán)境下,調(diào)試QString無顯示解決

    1、搜索 qt5.natvis.xml 文件,路徑一般為C:UsersieskongAppDataLocalMicrosoftVisualStudio16.0_cb8bc8a7Extensionsoih0nd55.5jrqt5.natvis.xml,【建議使用Everything這個工具搜索] 2、復(fù)制到C:Program Files (x86)Microsoft Visual Studio2019EnterpriseCommon7PackagesDebuggerVisualizers目錄下并重命名為qt5.natvis即可(如果

    2024年02月09日
    瀏覽(25)
  • [QT編程系列-21]:基本框架 - QT常見數(shù)據(jù)結(jié)構(gòu):QString、QList、QVector、QMap、QHash、QSet、QPair詳解

    [QT編程系列-21]:基本框架 - QT常見數(shù)據(jù)結(jié)構(gòu):QString、QList、QVector、QMap、QHash、QSet、QPair詳解

    目錄 1 QString 2 QList 3?QVector 4?QMap 5?QHash 6 QSet 7?QPair QString是Qt中用于存儲和操作字符串的類。它提供了豐富的字符串處理方法和功能。 以下是QString的一些主要特點(diǎn)和常用操作: 創(chuàng)建QString對象: 獲取字符串內(nèi)容和長度: 字符串比較和搜索: 字符串分割和連接: 字符串格式

    2024年02月16日
    瀏覽(50)
  • [QT編程系列-22]:基本框架 - QT常見數(shù)據(jù)結(jié)構(gòu):QString、QList、QVector、QMap、QHash、QSet、QPair快覽

    目錄 1. QT常見數(shù)據(jù)結(jié)構(gòu)概述 2. QList與QVector比較 3.?QPair和QMap比較 4. QT數(shù)據(jù)結(jié)構(gòu)與STL庫數(shù)據(jù)結(jié)構(gòu)比較 5. QT數(shù)據(jù)結(jié)構(gòu)與STL庫數(shù)據(jù)結(jié)構(gòu)性能比較 在Qt中,有幾個主要的數(shù)據(jù)結(jié)構(gòu)常用于處理和組織數(shù)據(jù),包括: QString: 用于存儲和操作字符串的類。QString是Qt中常用的字符串類型,提供

    2024年02月16日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包