将字符串转换为 char* 问题
Convert str to char* issue
我需要将 Str 转换为 char*,但有时会丢失一部分字符串。
例如:
str: "/Users/seb/Pictures/Photos/20141009 - Aulani - Hawaii/20141009_083318_Richtone(HDR).jpg"
char*: /Users/seb/Pictures/Photos/20141009 - Aulani - Hawaii/20141009_083318_Ri
我正在使用以下代码:
void TreeWidget::CopyFilesFromLocal(QStringList pathList, QTreeWidgetItem * item) {
QString fileelt;
uint32_t Folder_id = INVALID;
MyTreeWidget* myItem = dynamic_cast<MyTreeWidget*>(item);
uint32_t destination_id = myItem->mtp_item_id;
item->setExpanded(true);
qDebug() << "**************************************";
qDebug() << "Send to PULS Start";
qDebug() << "Start of Loop to copy files";
foreach(fileelt, pathList) {
char *txt = NULL;
// char *isFileName = NULL;
qDebug() << "str: " << fileelt;
txt = strdup(m_device.convertQStr2char(fileelt));
qDebug() << "char*: " << txt;
这是我用的api
char *PulsDeviceMngr::convertQStr2char(QString str) {
return const_cast<char*>(std::string(str.toUtf8().constData() ).c_str());
}
有什么想法吗?
你return形成convertQStr2char
的指针指向临时std::string
的内部缓冲区,它在return
之后被销毁。因此,您使用了悬垂指针并具有未定义的行为。
注意通过该指针改变std::string::c_string()
指向的数据也是UB。您的 const_cast
是一个非常糟糕的主意,因为即使您的生命周期正确,它也会允许这样做。
你也可以这样做(包括一些不必要的副本,但先让它工作,然后再考虑其余的):
char *PulsDeviceMngr::convertQStr2char(QString str) {
return strdup(std::string(str.toUtf8().constData() ).c_str());
}
那么别忘了free
缓冲区。但是按值 return std::string
然后在转换函数之外使用 .c_str()
可能会更好。这样,您就不需要使用非 C++ strdup
,也不需要手动管理内存,否则很容易出错。
您不需要额外的方法
txt = strdup(fileelt.toUtf8().constData());
会很好用。
我需要将 Str 转换为 char*,但有时会丢失一部分字符串。
例如:
str: "/Users/seb/Pictures/Photos/20141009 - Aulani - Hawaii/20141009_083318_Richtone(HDR).jpg"
char*: /Users/seb/Pictures/Photos/20141009 - Aulani - Hawaii/20141009_083318_Ri
我正在使用以下代码:
void TreeWidget::CopyFilesFromLocal(QStringList pathList, QTreeWidgetItem * item) {
QString fileelt;
uint32_t Folder_id = INVALID;
MyTreeWidget* myItem = dynamic_cast<MyTreeWidget*>(item);
uint32_t destination_id = myItem->mtp_item_id;
item->setExpanded(true);
qDebug() << "**************************************";
qDebug() << "Send to PULS Start";
qDebug() << "Start of Loop to copy files";
foreach(fileelt, pathList) {
char *txt = NULL;
// char *isFileName = NULL;
qDebug() << "str: " << fileelt;
txt = strdup(m_device.convertQStr2char(fileelt));
qDebug() << "char*: " << txt;
这是我用的api
char *PulsDeviceMngr::convertQStr2char(QString str) {
return const_cast<char*>(std::string(str.toUtf8().constData() ).c_str());
}
有什么想法吗?
你return形成convertQStr2char
的指针指向临时std::string
的内部缓冲区,它在return
之后被销毁。因此,您使用了悬垂指针并具有未定义的行为。
注意通过该指针改变std::string::c_string()
指向的数据也是UB。您的 const_cast
是一个非常糟糕的主意,因为即使您的生命周期正确,它也会允许这样做。
你也可以这样做(包括一些不必要的副本,但先让它工作,然后再考虑其余的):
char *PulsDeviceMngr::convertQStr2char(QString str) {
return strdup(std::string(str.toUtf8().constData() ).c_str());
}
那么别忘了free
缓冲区。但是按值 return std::string
然后在转换函数之外使用 .c_str()
可能会更好。这样,您就不需要使用非 C++ strdup
,也不需要手动管理内存,否则很容易出错。
您不需要额外的方法
txt = strdup(fileelt.toUtf8().constData());
会很好用。