2013-03-03 44 views
-1

OSX 10.8,碳製作的std :: string出++一個char *用C

我有一個std ::字符串,我想從一個char *

例推導:

CFStringRef *s; 
char *c[128]; 

CFStringGetCString(*s, *c, 128, kCFStringEncodingUTF8); 

int size = sizeof(c); 
g_uid.assign(c, size); 

但我得到一個無效的轉換,我不明白爲什麼

error: invalid conversion from 'char**' to 'long unsigned int'

std::string g_uid = "";被定義爲全球

+0

這不是一個'的char *',它是'字符*'的數組。 – chris 2013-03-03 21:21:30

+1

如果你想從'(const)char *'創建一個'std :: string',你可以做例如'const char * blah =「foo」; std :: string str = blah;'。 – 2013-03-03 21:21:44

+0

如果不清楚,只需將'char * c [128];'改爲'char c [128];'可能。 – 2013-03-03 21:25:35

回答

0

如果c其中char*,下面的工作:

g_uid.assign(c, size); 

的問題是,cchar*,它是128 char*秒的數組:

char *c[128]; 
+0

@Jason你是否熟悉指針是什麼? – 2013-03-03 21:29:44

0

這是C/C++中常見的初學者錯誤。我記得當天又犯了同樣的錯誤。像 char *c[128];這樣的聲明不會給你一個128字符的數組,因爲你可能會相信。它實際上給你128指針char s的數組。你不想那樣。

要聲明的前128個字符,看起來像一個數組:

char c[128]; 

現在你可能不認爲cchar*,因爲你看不到任何*秒,但任何時候聲明數組的東西,該變量會自動成爲您指定的任何類型的指針。它實際上指向數組的第一個元素的地址。

2

你對星號太慷慨了 - 你通常不需要指向CFStringRef的指針,而你的數組實際上是一個指針數組,這不是你想要的。

應該看起來更像是這樣的:

CFStringRef s; 
char c[128]; 

if (CFStringGetCString(s, c, 128, kCFStringEncodingUTF8)) 
{ 
    g_uid = c; 
} 
else 
{ 
    // 128 characters wasn't enough. 
} 
+0

感謝您的解釋。我當然不想要128個指針。 – Jason 2013-03-04 01:25:56

+0

謝謝我使用'.assign()' – Jason 2013-03-04 01:44:44

相關問題