QString에서 char *로 변환


94

다음 방법으로 QString을 char * 유형으로 변환하려고했지만 작동하지 않는 것 같습니다.

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

이 방법으로 가능한 결함을 자세히 설명하거나 다른 방법을 제공 할 수 있습니까?


귀하의 예가 잘 작동합니다. 문제는 어디입니까?
Viesturs

3
내 영어에 대해 미안하지만 그런 접근 방식을 사용하는 것이 옳지 않은 이유는 무엇입니까? QString s("some"); printf(reinterpret_cast<char *>(s.data()));
bartolo-otrit 2012-07-07

답변:


114

음, Qt FAQ 는 다음과 같이 말합니다.

int main(int argc, char **argv)
{
 QApplication app(argc, argv);
  QString str1 = "Test";
  QByteArray ba = str1.toLocal8Bit();
  const char *c_str2 = ba.data();
  printf("str2: %s", c_str2);
  return app.exec();
}

그래서 아마도 다른 문제가있을 것입니다. 이것이 정확히 어떻게 작동하지 않습니까?


11
const char*char*동일한 유형 없습니다.
궤도의 가벼운 경주

3
@LightnessRacesinOrbit : 자신도 모르게 QString의 내용에 쓰는 것은 끔찍한 생각이므로 물론 const char*실제로 얻을 수있는 것입니다. 사용자는 쓰기 가능한 버퍼에 데이터를 자유롭게 복사 할 수 있습니다.
Eli Bendersky 2012

1
완전히 동의 해. 그러나에 대해 묻는 질문에는 char*, 아니고 char const*귀하의 답변은 언급없이 그 사실을 무시합니다.
궤도의 가벼운 경주

4
@LightnessRacesinOrbit : 때때로 가장 좋은 대답은 질문을하지 않는 것입니다. 즉, 옳은 것을 요구하지 않는다는 것을 지적하는 것입니다. 이 답변은 내가 생각 때문에 그것의 목표 타격, 질문 포스터에 의해 받아 들여졌다
엘리 Bendersky을

2
FAQ가 사용하도록 업데이트 된 것 같습니다 toLocal8Bit().
Larry

52

아마도

my_qstring.toStdString().c_str();

Federico가 지적했듯이 더 안전합니다.

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

최적과는 거리가 멀지 만 작업을 수행 할 것입니다.


3
이것은 유니 코드 문자를 엉망으로 만들 것입니다. 유니 코드 친화적 인 솔루션 : stackoverflow.com/a/4644922/238387
jlstrecker

21
이 메서드는 매우 위험하므로 사용해서는 안됩니다 toStdString(). 새 std::string개체를 반환하면 내부 데이터에 대한 포인터를 const char *얻습니다. 그러나 문자열 객체는이 문 다음에 즉시 삭제되므로 후속 문에서 사용하면 결과 포인터에 유효한 주소가 없을 수 있습니다.
RicoRico 2016 년

@RicoRico toStdString()위험한 방법 이 아닙니다 . 그것은 원시 포인터의 사용입니다. 또는보다 구체적으로 범위가 잘 이해되지 않는 개체에서 원시 포인터를 사용합니다.
notlesh

특히 C ++ 임시는 일반적으로이를 생성하는 문이 끝날 때까지 유지됩니다. 따라서 대답의 첫 번째 형식은 함수 호출에서 인라인으로 사용되는 경우 괜찮지 만 (함수가 나중에 사용하기 위해 포인터를 저장하지 않는다고 가정) 변수에 할당되면 괜찮지 않습니다.
plugwash 2019

46

QStringchar * 로 변환하는 가장 쉬운 방법 은 qPrintable (const QString & str)으로 확장되는 매크로 str.toLocal8Bit().constData()입니다.


이것이 더 인기있는 답변이 아닌 이유는 무엇입니까? 나는 Qt 소스를 둘러 보면서 우연히 이것에 대해 배웠고, 그것이 정확히 그들이하는 일입니다.
Phlucious

6
@Phlucious qPrintable는 1) const char*not char*str.toLocal8Bit().data()반환하고 char*. 2) 사용 된 const char*문장에서 세미콜론을 치 자마자에 대한 포인터 가 무효화 qPrintable됩니다. 그래서 const char* c_ptr = s.toLocal8Bit().constData();말이되지 않습니다.
WindyFields

1
@Phlucious 감사합니다 당신은 생명의 은인입니다 :) 이러한 모든 최고 투표 답변이 잘못되었습니다, 질문은 char에 관한 것이고 그들은 const char *를 반환하고 있습니다.
user889030

되어 qPrintable출력은 제로가 종료 보장?
Giovanni Cerretani

@WindyFields- qPrintable()설명 에서 경고했듯이 : "qPrintable ()이 사용 된 명령문 이후에는 char 포인터가 유효하지 않습니다."
Jeremy

6

David의 대답은 파일로 출력하거나 화면에 표시하는 데만 사용하는 경우 제대로 작동하지만 함수 또는 라이브러리에 구문 분석을 위해 char *가 필요한 경우이 방법이 가장 잘 작동합니다.

// 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);

4

편집 됨

이 방법도 작동합니다

QString str ("Something");

char* ch = str.toStdString().C_str();

요청 된 내용이 아닌 다른 전환 ( std::stringQString) 처럼 보입니다 .
Toby Speight

3

문자열에 Latin1이 아닌 문자가 포함될 수 있으며 이로 인해 데이터가 정의되지 않습니다. "작동하지 않는 것 같습니다"라는 의미에 따라 다릅니다.


2

올바른 솔루션은 다음과 같습니다.

   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<<"<---";

C 스타일 캐스팅을 사용하지 마십시오.
kyb

2

문자열에 ASCII가 아닌 문자가 포함되어있는 경우 다음과 같이하는 것이 좋습니다. s.toUtf8().data()(또는 s->toUtf8().data())


0

std :: vector를 중간 컨테이너로 사용하는 실행 가능한 방법입니다.

QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();

0

Qt는 가장 간단한 API를 제공합니다

const char *qPrintable(const QString &str) and const char *qUtf8Printable(const QString &str)

상수가 아닌 데이터 포인터를 사용하려면

str.toLocal8Bit().data() or str.toUtf8().data()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.