2016-11-03 66 views
0

關閉蝙蝠 - 我是C++的新手。連接2個char *會產生奇怪的結果

所以我正在處理的情況下,我有兩個char*需要連接並傳遞到另一種方法。這應該是簡單的,但我就是想不通......

第一炭和參考getMetaData()方法聲明

virtual const char *getMetaData() const = 0 
char* metaChar = const_cast<char*>(result->getMetaData()); 

第二個字符,並以供參考getUniqueTargetId()方法聲明

virtual const char *getUniqueTargetId() const = 0 
char* idChar = const_cast<char*>(result->getUniqueTargetId()); 

現在我需要將它們合併到方法setUserData()。以下是聲明它:

virtual bool setUserData(void *userData) = 0 

現在,如果我通過各那些char進入setUserData()方法單獨,它工作正常。如果我嘗試連接它們,然後傳遞結果,它會產生nil或一些看起來像拉丁文的隨機字符。

我試過以下(加上其他一些和變化):

  1. 每個轉換爲NSString的,concatonate那些,轉換回char
  2. 試圖concatonate兩個char陣列
  3. 鑄造各種不同的東西和來回
  4. 關掉它又回來
  5. 檢查了的類型和上面的選項1的結果和它們對應 - 顯然如出一轍

再次 - 我是新一輪的這些部件......有可能是一些明顯我失蹤,但它一直是一個小時數現在這似乎是一個不應該佔用這麼多時間的問題。

+0

使用'const_cast'去除'const'然後使用轉換的結果是UB – SingerOfTheFall

+0

@SingerOfTheFall:只有在非const的上下文中使用轉換的結果。 – Bathsheba

+0

@Bathsheba,真的,我應該說「可能導致UB」。 – SingerOfTheFall

回答

2

很多討厭的const_cast和轉換爲void*在這裏,但我認爲你給了這些方法,所以不能做很多這方面的。

假設setUserData需要在內部傳遞的字符串的副本,然後兩個char*「串」 foobar,你可以使用

setUserData(const_cast<void*>(reinterpret_cast<const void*>((std::string(foo) + std::string(bar)).c_str())));

在這裏,我依靠std::string的超載+來執行連接。 c_str()返回一個const char*並且在聲明的生命週期內有效。我是希望setUserData需要一個「字符串」的深層副本:檢查函數文檔。如果我不正確,那麼這種方法是不可行的。請注意,我們通過const_cast將其轉換爲void*,這並不是我特別喜歡的,但對這類事情做出明確表示很好。

如果你「擁有」了所有的功能,那麼把所有的char*廢話廢話,並使用std::string從一開始。

+0

值得注意的是,如果'setUserData'只存儲你傳入的指針,那就是UB派對時間。 – TartanLlama

+2

我試圖用「假設setUserData接受內部傳遞的字符串的副本」來清除它。但我開始認爲這個問題非常難以回答。 – Bathsheba

+0

是的,我知道你的意思,但一個新手可能不會:)。你的編輯很好地澄清。 – TartanLlama

0

所以我最終找到了我的解決方案 - 謝謝大家的幫忙!

我基本上採取了一輪漫長的道路,是的,這似乎相當多餘,但對於一個初學者(如一週的經歷 - 我在這裏被強迫),它的工作原理...

char* metaChar = const_cast<char*>(result->getMetaData()); 
char* idChar = const_cast<char*>(result->getUniqueTargetId()); 

char *buffer = new char[(int)strlen(metaChar)+(int)strlen(idChar)+5](); 
strncat(buffer, idChar, strlen(idChar)); 
strncat(buffer, metaChar, strlen(metaChar)); 
strncat(buffer, "\0", 2); 

newTrackable->setUserData(buffer); 

+5只是爲了提供一個緩衝區(哈...看看我在那裏做了什麼?)爲char或任何可能需要更多空間。寧可安全,不要抱歉。

相關問題