Estaba intentando convertir un QString al tipo char * mediante los siguientes métodos, pero parece que no funcionan.
//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());
¿Puede explicar el posible defecto de este método o dar un método alternativo?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Respuestas:
Bueno, las preguntas frecuentes de Qt dicen:
Quizás tengas otros problemas. ¿Cómo no funciona esto exactamente?
fuente
const char*
ychar*
no son del mismo tipo.const char*
es lo que realmente se puede obtener. El usuario es libre de copiar los datos a un búfer grabable.char*
, nochar const*
, y su respuesta simplemente ignora ese hecho sin mencionarlo.toLocal8Bit()
?Tal vez
my_qstring.toStdString().c_str();
o más seguro, como señala Federico:
Está lejos de ser óptimo, pero hará el trabajo.
fuente
toStdString()
devuelve un nuevostd::string
objeto y luegoconst char *
se obtiene el puntero a los datos internos . Sin embargo, el objeto de cadena se destruye inmediatamente después de esta declaración, por lo que el puntero de resultado probablemente no tenga una dirección válida si lo usa en una declaración posterior.toStdString()
que es peligroso; es el uso de punteros sin procesar. O, más específicamente, el uso de punteros sin procesar de objetos cuyos alcances no se comprenden bien.La forma más fácil de convertir un QString a char * es qPrintable (const QString & str) , que es una macro que se expande a
str.toLocal8Bit().constData()
.fuente
qPrintable
vuelveconst char*
nochar*
,str.toLocal8Bit().data()
vuelvechar*
. 2) El puntero a seconst char*
vuelve inválido tan pronto como presione un punto y coma en la instrucción dondeqPrintable
se usó. Entoncesconst char* c_ptr = s.toLocal8Bit().constData();
no tiene ningún sentido.qPrintable
garantiza que la salida termina en cero?qPrintable()
descripción: "El puntero char no será válido después de la declaración en la que se usa qPrintable ()".La respuesta de David funciona bien si solo la está usando para enviar a un archivo o mostrarla en la pantalla, pero si una función o biblioteca requiere un carácter * para analizar, este método funciona mejor:
fuente
EDITADO
de esta manera también funciona
fuente
std::string
→QString
), no lo que se solicita.Su cadena puede contener caracteres que no sean Latin1, lo que conduce a datos indefinidos. Depende de lo que quieras decir con "no parece funcionar".
fuente
la solución correcta sería así
fuente
Si su cadena contiene caracteres que no son ASCII, es mejor hacerlo de esta manera:
s.toUtf8().data()
(os->toUtf8().data()
)fuente
Es una forma viable de usar std :: vector como contenedor intermedio:
fuente
Qt proporciona la API más simple
Si desea utilizar un puntero de datos no constante
fuente