2012-11-15 75 views
1

我有一個QString,我想轉換成char *而不是QChar *,因爲我將它傳遞給一個需要char *的方法,但是我可以沒有它得到一個const char *就不會轉換它。例如,我曾嘗試:如何將QString轉換爲char *

QString name = "name"; 
QByteArray byteArray = name.toUtf8(); 
myMailboxName = byteArray.constData(); 

QString name = "name"; 
QByteArray byteArray = name.toUtf8(); 
myMailboxName = byteArray.data(); 

其中myMailboxName是我班一個私人的char *。但是,我得到一個錯誤,因爲它返回一個const char *並且不能將它分配給一個char *。我怎樣才能解決這個問題?

+0

DUP? http://stackoverflow.com/questions/5505221/converting-qstring-to-char – billz

+0

不要。你被賦予一個指向你可能不會修改的數據的指針,所以不要把它分配給char *。將它分配給一個「char const *」。爲什麼你長期存儲指針? –

+0

@billz:不完全是一個重複。看來Amre需要一個指向可變字符的指針,而不是'const char *' –

回答

3

這是因爲data()返回bytearray中緩衝區的地址,你可以讀它,但顯然你不應該寫它。 你在bytearray之外有你自己的緩衝區。如果你想要數據,你應該將bytearray的緩衝區複製到myMailBoName中。

使用memcpy函數

+0

工作,謝謝。 – Amre

1

使用strdup。它同時進行分配和複製。記住一旦你完成就釋放它。

1

你真的可以使用strdupstackoverflow question about it),麥克建議,但你也可以這樣做:

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

了那裏:stackoverflow similar question

2

試試這個代碼片段

const char *myMailboxName = name.toLatin1().data(); 
+0

歡迎獲得您的前10個代表點。請查看如何使用Markdown格式 - 這將允許您的答案中的代碼被語法突出顯示並以單音空間字體顯示。在答案/問題文本框旁邊是'?'提供基礎知識的圖標。 – marko

0

我使用這樣的包裝:

template<typename T, typename Y> 
void CharPasser(std::function<T(char *)> funcToExecute, const Y& str) 
{ 
    char* c = 0; 
    c = qstrdup(c, str.c_str()); 
    funcToExecute(c); 
    delete[] c; 
} 

int SomeFunc(char*){} 

然後用它喜歡:

CharPasser<int, std::string>(SomeFunc, QString("test").tostdString()) 

至少這樣可以節省一點打字。 .. :)

0

考慮下面的例子
QString str = "BlahBlah;"

試試這個
char* mychar = strdup(qPrintable(str));

或本
char* mychr = str.toStdString().c_str();

或本
char* mychar = strdup(str.ascii());

每個語法爲我工作;)