2012-12-19 19 views
1

我是C++的新手,還沒有完全掌握所有的概念,所以我很困惑爲什麼這個函數不起作用。我目前不在家,所以我不能發佈編譯器錯誤,只要我回家,我會盡快完成。返回一個常量字符指針會產生一個錯誤

這是功能。

const char * ConvertToChar(std::string input1, std::string input2) { 
    // Create a string that you want converted 
    std::stringstream ss; 
    // Streams the two strings together 
    ss << input1 << input2; 
    // outputs it into a string 
    std::string msg = ss.str(); 
    //Creating the character the string will go in; be sure it is large enough so you don't overflow the array 
    cont char * cstr[80]; 
    //Copies the string into the char array. Thus allowing it to be used elsewhere. 
    strcpy(cstr, msg.c_str()); 

    return * cstr; 
} 

它使連接和轉換兩個字符串在一起,以返回一個const char *。那是因爲我想用它的函數需要一個const char指針來傳遞。

+0

字符串可以更容易連接:'string1 + string2'。你不需要整個'stringstream'的東西。 –

回答

3

該代碼返回一個指向本地(堆棧)變量的指針。當調用者獲取該指針時,該局部變量不再存在。這通常被稱爲懸掛參考。

如果要將std::string轉換爲c風格字符串,請使用std::string::c_str()

因此,連接兩個字符串,並得到一個C風格的字符串做:

std::string input1 = ...; 
std::string input2 = ...; 

// concatenate 
std::string s = input1 + input2; 

// get a c-style string 
char const* cstr = s.c_str(); 
// cstr becomes invalid when s is changed or destroyed 
+0

那麼我需要做一個全局的char變量,它會修改而不是返回本地變量?你也可以詳細說明你本地(堆棧)變量的含義。 – Dibesjr

+0

那麼我如何避免它被破壞? – Dibesjr

+0

@Dibesjr我爲你添加了連接示例。 –

1

不知道是什麼錯誤,這很難說,但這個 行:

const char* cstr[80]; 

看起來不對:它創建了一個80個指針的數組;當它 隱式轉換爲指針時,類型將爲char const**,當它作爲參數strcpy傳遞給 參數時應該給出錯誤,並且返回 語句中的取消引用與編寫cstr[0]時的返回值相同,並返回 數組—中的第一個指針,因爲數組 的內容從未初始化,這是未定義的行爲。

你去任何前進一步,你必須定義什麼功能 應該返回—不僅是它的類型,但其中所指向的內存 將駐留。有三種可能的解決方案是:

使用本地靜態的緩衝區:
此溶液 經常用C早期使用,並且仍然存在於C庫的一些 功能。它有兩個主要缺陷:1)連續調用 將覆蓋結果,因此客戶端代碼 必須在再次調用該函數之前製作其自己的副本,並且2) 它不是線程安全的。 (第二個問題可以通過使用 線程本地存儲來避免)。在像您這樣的情況下,它也有 的問題,即緩衝區必須足夠大才能滿足數據的要求,其中 可能需要動態分配,這會增加複雜度。
返回一個指向動態分配的內存:
這行之有效的理論,但需要客戶端的代碼來釋放 內存。這必須嚴格記錄,並且極易出錯。
要求客戶端代碼以提供緩衝:
這可能是現代代碼的最佳解決方案,但它確實 意味着你需要的地址和長度 緩衝區的額外的參數。

除了這一點:沒有必要使用std::ostringstream 如果你正在做的是串聯;只需添加兩個字符串。 無論您使用哪種解決方案,都要驗證結果是否合適。

+0

感謝您的詳細描述!每天學習新東西! C++是我必須解決的最難的語言。大多數其他語言對於可以做什麼和不可以做什麼都有非常明確的規則。這對於像我這樣的新手來說是一個挑戰,因爲它伴隨着所有的規則和細微差別。 – Dibesjr

相關問題