QString的奇怪行为

问题描述 投票:0回答:1

这是我的代码。

#include <QCoreApplication>
#include <QTextStream>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream out(stdout);

    QString filename = "F:/temp/йцук.tx";

    out << filename << endl;

    const wchar_t* fn_wch = filename.toStdWString().c_str();

    std::wcout << filename.toStdWString().c_str() << std::endl;   //1
    std::wcout << fn_wch << std::endl;                            //2

    return a.exec();
}

问题是 "1 "行和 "2 "行输出的字符串不一样 但是它们不是应该是一样的吗?因为在这之前我把fn_wch分配给了filename.toStdWString().c_str()。

UPD0:

我修改了代码以防止访问被销毁的wstring的数据:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream out(stdout);

    QString filename = "F:/temp/йцук.tx";

    out << filename << endl;

    auto wstr = filename.toStdWString();

    auto wchar = wstr.c_str();

    std::wcout << wchar << std::endl; //1

    std::wcout << wchar << std::endl; //2

    std::wcout << wstr; //3

    return a.exec();
}

但问题还是一样: 第1行输出数据, 但第2和第3行没有.

qt stdstring qstring wchar
1个回答
0
投票
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "russian");
    QCoreApplication a(argc, argv);
    QTextStream out(stdout);

    QString filename = "F:/temp/йцук.tx";

    out << filename << endl;

    auto wstr = filename.toStdWString();

    //auto wchar = wstr.c_str();
    wchar_t wchar[wstr.size()];
    wcscpy(wchar, wstr.c_str());

    std::wcout << wchar << std::endl; //1

    std::wcout << wchar << std::endl; //2

    std::wcout << wstr; //3

    return a.exec();
}

它工作了。c_str()中的指针被取消了,所以你需要复制数据。

© www.soinside.com 2019 - 2024. All rights reserved.