2010-04-01 63 views
22

如果我將char *傳遞給函數。然後我想把這個char *轉換成一個std :: string,一旦我得到我的結果將它轉換回char *從一個std :: string來顯示結果。如何將char *複製到字符串中,反之亦然

  1. 我不知道如何轉換做到這一點(我不是說爲const char *只是字符*)
  2. 我不知道如何操作鼠標指針我送的價值。

這樣的步驟我需要做的

  1. 採取在一個char *
  2. 將其轉換成字符串。
  3. 取出該字符串的結果並將其以char的形式放回*
  4. 返回結果,以便該值可在函數外部使用並且不會被銷燬。

如果可能的話,我可以看看它是如何通過引用來完成的vs指針(它的地址是通過值傳遞的,但是我仍然可以修改指針指向的值,所以即使指針的副本在功能上的地址也被打爛我仍然看到了改變的值以外

感謝

+1

「將它從std :: string轉換回char *以顯示結果。」 - 爲什麼你不能顯示結果時,它是一個字符串?應該可以做std :: cout << my_string; – 2010-04-01 22:23:23

+0

這是我必須使用的界面。所以雖然我使用字符串,只要我可以如果一個接口需要char *那麼這就是我必須使用的。函數輸出參數是一個char * ...這就是我必須使用的 – user295030 2010-04-01 22:29:06

+3

在這種情況下,接口應該說一些關於內存管理的內容。我說「應該」,因爲它*可能*不是 - 某些接口指定得很差,生活的事實。無論何時從函數返回指針,都需要說明誰負責分配所指向的數據,它保持有效的時間以及誰負責釋放它(如果適用)。如果你能解決這個問題,你可以找出如何返回一個合適的指針值。 – 2010-04-01 22:39:17

回答

36

轉換一個char*std::string:!

char* c = "Hello, world"; 
std::string s(c); 

轉換一個std::stringchar*

std::string s = "Hello, world"; 
char* c = new char[s.length() + 1]; 
strcpy(c, s.c_str()); 

// and then later on, when you are done with the `char*`: 
delete[] c; 

我更喜歡使用一個std::vector<char>而不是實際的char*;那麼你就不必管理自己的記憶:

std::string s = "Hello, world"; 
std::vector<char> v(s.begin(), s.end()); 
v.push_back('\0'); // Make sure we are null-terminated 
char* c = &v[0]; 
+1

是的,但在後一種情況下,當你使用c_str()時,它返回一個const char *而不是char * – user295030 2010-04-01 22:26:50

+0

@ user295030:'c_str()確實返回一個'const char *'; 「strcpy」的第二個參數(源字符串)的類型爲「const char *」。如果你只需要一個'const char *',那麼就不需要這樣做,你可以使用'c_str()'的結果。 – 2010-04-01 22:32:59

+0

s.c_str()返回一個const char *,這就是爲什麼他將它拷貝到名爲c的char *中。在你的函數中,你將返回c。 – 2010-04-01 22:41:33

1

你需要看你如何處理從您返回指針,例如,由於存儲在STD分配下面的代碼將無法正常工作的內存: :字符串將在fn()退出時釋放。

const char* fn(const char*psz) { 
    std::string s(psz); 
    // do something with s 
    return s.c_str(); //BAD 
} 

一種解決方案是在功能分配內存,並確保函數的調用者釋放它:

const char* fn(const char*psz) { 
    std::string s(psz); 
    // do something with s 
    char *ret = new char[s.size()]; //memory allocated 
    strcpy(ret, s.c_str()); 
    return ret; 
} 
.... 
const char* p = fn("some text"); 
//do something with p 
delete[] p;// release the array of chars 

或者,如果你知道字符串的大小上限您可以自己在堆棧上創建它並傳入指針,例如

void fn(const char*in size_t bufsize, char* out) { 
    std::string s(psz); 
    // do something with s 
    strcpy_s(out, bufsize, s.c_str()); //strcpy_s is a microsoft specific safe str copy 
} 
.... 
const int BUFSIZE = 100; 
char str[BUFSIZE]; 

fn("some text", BUFSIZE, str); 
//ok to use str (memory gets deleted when it goes out of scope) 
0

您可以維護你的庫作爲 std::vector<char*> g_gc;這是你的圖書館「LIB」訪問實現的垃圾收集器。稍後,您可以通過調用lib::release_garbage();

char* lib::func(char*pStr) 
{ 
    std::string str(pStr); 
    char *outStr = new char[str.size()+1]; 
    strcpy(outStr, str.c_str()); 
    g_gc.push_back(outStr); // collect garbage 
    return outStr; 
} 

release_garbage功能看起來就像釋放在您方便g_gc所有指針:

void lib::release_garbage() 
{ 
    for(int i=0;i<g_gc.size();i++) 
    { 
     delete g_gc[i]; 
    } 
    g_gc.clear(); 
} 

在單線程模型,你可以保持這個g_gc靜態的。多線程模型將涉及鎖定/解鎖它。

+0

這是_very_危險;將裸指針存儲在容器中幾乎總是一個壞主意,因爲確保異常安全性非常困難。 (見這裏的替代方案:http://stackoverflow.com/questions/2558134/2558152#2558152)。另外,你的答案中的代碼有一個嚴重的錯誤:它使用不匹配的'new []'和'delete'。 – 2010-04-02 03:26:40

+0

這是一個偉大的線程。感謝您指出刪除[]。 – Pankaj 2010-04-02 03:32:03

+0

因此,你甚至不能根據需要「垃圾收集」,因爲有些指針可能正在使用。你只能在你的應用程序退出時安全地執行它,這使得它無用,因爲當你的應用程序退出時分配內存被釋放。 – Blindy 2010-08-01 03:02:00

相關問題