QString 的奇怪行为
Strange behavior with QString
这是我的代码:
#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行没有。
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()中的指针被破坏,是否需要复制数据。
这是我的代码:
#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行没有。
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()中的指针被破坏,是否需要复制数据。