2012-04-22 110 views
0

是否有可能做到這一點C++返回字符串

std::string str(const char* s) 
{ 
    return std::string(s); 
} 

int main() { 
    char* strz = (char*)str("asd").c_str(); 
} 

相反的:

int main(){ 
    std::string temp = str("asd"); 
    char* strz = (char*)temp.c_str(); 
} 

我知道這應該是const char* strz但我需要它只有在代碼(塊沒有新/刪除)。從方法返回字符串後,它查找引用(如果不能找到它,刪除字符串),然後調用c_str()。我有很多char(獨立於我),我可以使用第二種解決方案,但它需要太多的代碼。

+0

請使用內聯代碼語法('\'\'')將代碼縮進4個空格,而不是將每行標記爲代碼! – 2012-04-22 17:00:14

+0

^即突出顯示所有內容,然後按ctrl-K或點擊代碼格式按鈕 – chris 2012-04-22 17:03:53

+0

您的'str'功能是不需要的。你只是爲了縮短代碼嗎? – 2012-04-22 17:16:03

回答

6

如果你使用第二個選項 -

std::string temp = str("asd"); 
char* strz = (char*)temp.c_str(); 

你可能運行到未定義行爲。修改strz的內容是非法的。您必須使用strcpy才能獲得可變數組char's。你的第一個也不會更好,此外,這是多餘的,因爲你可以直接使用string的構造函數。

總之,要獲得從string你可以做一個char*

char* get(const std::string& str) 
{ 
    char* ret = new char[str.length() + 1](); 
    strcpy(ret,str.c_str()); 
    return ret; 
} 

當你用它做你必須delete[]記錄自己。

+0

我只需要暫時使用此轉換(甚至不可寫入),稍後將其複製(但從char *複製) – user1112008 2012-04-22 17:09:44

+2

@ user1112008如果它不可寫,爲什麼不用'const char *'? – 2012-04-22 17:10:25

+0

正如我告訴它是獨立於我:(我可以編輯結構,它保存在「我的身邊」,但在「另一端」它將被讀爲char *'。我正在寫現有應用程序的擴展(發送是同步的)。 – user1112008 2012-04-22 17:12:37

1

甚至還有超越的爲const char *投一個問題爲char *

char* strz = (char*)str("asd").c_str(); 

這將創建一個臨時的std :: string這是在該行的末尾銷燬。這使得char * strz無效。

這聽起來像你對我應該只舉行對返回的std :: string,而不是將其作爲臨時:

std::string strz = str("asd"); 
... 
foo(strz.data()); // use strz 
1

讓我猜猜,你要問和回答的是什麼:)隨意忽視,如果我猜錯了:)

所以,你有一些函數,返回std::string

std::string str(...); 

而且你有一個使用一些舊代碼(太舊,甚至不聲明其參數爲const char*,即使它不會修改字符串),要與結果的使用方法:

int ugly_func1(char*) {...} 
int ugly_func2(char*) {...} 
int ugly_func3(char*) {...} 

int main() 
{ 
    std::string temp = str(...); 
    char* temp1 = (char*)temp.c_str(); 
    ugly_func1(temp1); 
    ugly_func2(temp1); 
    ugly_func3(temp1); 
} 

所以,不,你必須使用與temp變量的語法。你不能這樣寫:

int main() 
{ 
    char* temp = (char*)str(...).c_str(); 
    ugly_func1(temp); 
    ugly_func2(temp); 
    ugly_func3(temp); 
} 

這是非法的代碼(例如,在它調用ugly_func1之前摧毀str()返回值)。令人討厭的是,它可能有時似乎工作。