2010-03-26 2 views
59

Я пытался преобразовать QString в тип char * следующими способами, но они, похоже, не работают.QString to char * conversion

//QLineEdit *line=new QLineEdit();{just to describe what is line here} 

QString temp=line->text(); 
char *str=(char *)malloc(10); 
QByteArray ba=temp.toLatin1(); 
strcpy(str,ba.data()); 

Можете ли вы уточнить возможные недостатки с помощью этого метода или дать альтернативный метод?

+0

Ваш пример отлично работает для меня, где проблема? – Viesturs

+2

Извините за мой английский, но почему неправильно использовать такой подход? 'QString s (" some "); printf (reinterpret_cast (s.data())); ' –

ответ

75

Ну, Qt FAQ говорит:

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(); 
} 

Так что, возможно у вас возникли другие проблемы. Как точно это не работает?

+8

' const char * 'и' char * '- это не тот же тип. –

+2

@LightnessRacesinOrbit: запись в содержимое QString без его знания - это ужасная идея, поэтому, конечно, 'const char *' - это то, что действительно можно получить. Пользователь может скопировать данные в записываемый буфер. –

+1

Я полностью согласен. Однако вопрос о 'char *', а не 'char const *', и ваш ответ просто игнорирует этот факт без упоминания. –

1

Ваша строка может содержать символы не Latin1, что приводит к неопределенным данным. Это зависит от того, что вы подразумеваете под «это, похоже, не работает».

32

Может

my_qstring.toStdString().c_str();

или безопаснее, так как Федерико отмечает:

std::string str = my_qstring.toStdString(); 
const char* p = str.c_str(); 

Это далеко от оптимального, но будет делать свою работу.

+3

Это испортит символы Юникода. Удобное для Unicode решение: http://stackoverflow.com/a/4644922/238387 – jlstrecker

+9

Этот метод очень опасен и не должен использоваться: 'toStdString()' возвращает новый объект 'std :: string', а затем указатель к внутренним данным 'const char *'. Тем не менее, строковый объект сразу же уничтожается после этого оператора, поэтому указатель результата, вероятно, не имеет действительного адреса, если вы используете его в следующей инструкции. – RicoRico

6

ответ Дэвида отлично работает, если вы только использовать его для вывода в файл или отображения на экране, но если функция или библиотека требует символ * для синтаксического анализа, то этот метод лучше всего работает:

// copy QString to char* 
QString filename = "C:\dev\file.xml"; 
char* cstr; 
string fname = filename.toStdString(); 
cstr = new char [fname.size()+1]; 
strcpy(cstr, fname.c_str()); 

// function that requires a char* parameter 
parseXML(cstr); 
23

Самый простой способ преобразовать QString в символ * является qPrintable(const QString& str), которая является макро-расширения для str.toLocal8Bit().constData().

+0

Это помогает мне с QObject :: tr, спасибо. – Joel

+0

Почему это не самый популярный ответ?Я только что узнал об этом случайно, показывая вокруг Qt-источника, и это именно то, что они делают. – Phlucious

+1

@Phlucious, потому что: 1) 'qPrintable' возвращает' const char * 'not' char * ',' str.toLocal8Bit(). Data() 'возвращает' char * '. 2) Указатель на 'const char *' становится недействительным, как только вы нажимаете точку с запятой в инструкции, в которой использовался 'qPrintable'. Поэтому 'const char * c_ptr = s.toLocal8Bit(). ConstData();' не имеет никакого смысла. – WindyFields

1

Правильное решение было бы, как этот

QString k; 
    k = "CRAZYYYQT"; 
    char ab[16]; 
    sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data())); 
    sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data())); 
    sprintf(ab,"%s",(const char *)k.toStdString().c_str() ); 
    qDebug()<<"--->"<<ab<<"<---"; 
+0

Забудьте использовать кастинг C-стиля. – kyb