2017-09-23 40 views
0

我有一個數字,我需要轉換爲const char *(我使用它們的API需要const char *作爲其許多函數的輸入)。以下作品:轉換爲std :: string並在一行中獲取const char *

int num = 5; 
std::string s = std::to_string(5); 
const char * p = s.c_str(); 

由像那些how to convert from int to char*?答案建議,但它涉及到創建看似不必要的變量s,所以我嘗試以下,但它不工作(p指向一個空字符串之後):

int num = 5; 
const char * p = std::to_string(num).c_str(); 

有沒有一個乾淨的方式,我可以做到這一點?爲什麼第二個例子不工作?該行爲非常相似,會發生什麼,如果我做了這個明顯的錯誤:

const char * p; 
{ 
    std::string tempStr("hi"); 
    p = tempStr.c_str(); 
    // p points to "hi" string. 
} 
// now p points to "" string. 

這讓我懷疑,這個問題std::to_string(num)立即超出範圍或相似的,因爲它不是直接用來初始化任何東西。

+0

爲什麼不直接使用'的std :: string',忘了'爲const char *'? (一個'std :: string'只是一個'char *'包裝在有用的代碼中去做一些你不需要的東西) – Galik

+0

這個「看似不必要的」實例管理'p'指向的動態分配的內存。在第二個例子中,該內存立即釋放,留下'p'懸掛指針。在第三個例子中,只是更明確一點。 –

+0

@Galik是的我很喜歡,但我使用的API需要一個const char *作爲我使用了很多功能的輸入。 – aquirdturtle

回答

3

std::string封裝管理動態存儲器(與new[]delete[]創建)。讓我們分解它。

const char * p = std::to_string(num).c_str(); 
  1. 創建std::string(的num用人類可讀表示)。
  2. 獲取new[] ly分配給const char*的字符串。
  3. 將該值指定爲p
  4. 銷燬std::stringdelete[]分配const char*
  5. p點......釋放數據

如果您正在使用一個指針,該指針指向必須存在貫穿該指針的生命期的數據。

所以,不,除了new[]這個字符串的副本之外,沒有辦法解決這個問題,你必須在以後明確地delete[]。在那個時候,你已經把嬰兒扔出浴盆,並且不需要使用std::string

創建一個至少與您想要引用其內部數據一樣長的字符串。

0

你需要的是一個返回char*的函數,它保存你的值並且可以用來管理它的生命週期。有問題的版本被破壞,因爲char*指向它不管理的內存。

例如:

std::unique_ptr<char[]> str(int32_t x) 
{ 
    std::unique_ptr<char[]> res(new char[12]); 
    snprintf(res.get(), 12, "%d", x); 
    return res; 
} 
-1

使用std::string隨處可見,不要使用const char*,如果不是必要的話。他們基本上是一樣的東西。我只在使用文件路徑時才使用const char*。 無處不在使用std::string,您的程序應該可以正常工作。

+3

'使用命名空間STD'不僅是一個錯字,它不適用於頭文件(全局範圍)。不是一個好的建議。 –

+0

對不起,約翰Saini先生。我想通了,我修好了。感謝您的反對票和電子評論。 –

3

只需使用std::string它可以完成您想要的任何操作,以及您不需要手動執行的任何操作(如果不使用它)。

當你需要傳遞一個const char*const char*功能只需使用std::string::c_str()這樣的:

some_api_function(mystring.c_str()); // passes a const char* 
相關問題