2012-02-16 74 views
3

如何將string轉換爲char *我正在使用以下方法,但它不起作用。如何將字符串轉換爲char *在C++中?

在運行時,它給了我下面的錯誤:

Run-Time Check Failure #3 - The variable 'url' is being used without being initialized.

eventhough我已初始化它,如代碼波紋管。你能給我一個例子嗎?

char* url; 
    sup = "news" 
    sup="http://www."+sup+"yahoo.com"; 
    strcpy(url, sup.c_str()); 

我使用Microsoft Visual Studio 2010中,C++控制檯

+0

如果你只是想使用字符指針,你可以簡單地使用sup.c_str(),而不是再次爲變量'url'分配相同數量的字節。 – PermanentGuest 2012-02-16 11:02:23

+0

@Unni它會是一個常量字符*雖然(不只是一個字符*)。但我同意這可能是實際需要的。 – adelphus 2012-02-16 11:28:32

+1

我會在任何地方使用'std :: string',直到你需要將它傳遞給遺留系統。然後使用'std :: string :: c_str()'。有沒有理由你不能使用'std :: string'? – 2012-02-16 11:51:48

回答

5

strcpy不爲你分配內存,你必須自己做,記得留出空間爲空值終止字符:

char* url = new char[sup.length()+1]; 

char url[sup.length()+1]; 
//... 
strcpy(url, sup.c_str()); 

在第一種情況下,不要忘記delete[]數組。第二種情況只有在你的編譯器支持C99可變長度數組作爲擴展時纔有效。

+0

非常感謝。現在效果很好 – 2012-02-16 10:59:44

+1

它可能工作得很好,但這不是我認爲最好的答案。你是否總是急於接受有效的第一個答案,而無需等待其他人的評論?我不喜歡這個答案的原因是在C++中,你應該避免使用new和raw數組,但應該更喜歡使用vector。 boost :: shared_array 將是另一種選擇,如果你真的覺得你必須使用新的。第二個機構我不特別喜歡,因爲它選擇一個任意大小,然後希望它適合沒有任何檢查任何。事實上,我不知道爲什麼32選擇第一個街區。 – CashCow 2012-02-16 11:13:53

+0

@CashCow呃沒有。給出的答案在C中是一個好的和標準的練習。你使用boost或vector 的答案是不直觀的,並且(IMO)很混亂。 – adelphus 2012-02-16 11:21:15

1
char* url = new char[100]; 

您必須首先爲您的char數組分配內存。

0

sup複製到url並不意味着您已初始化url
初始化url意味着爲它分配內存。像這樣:

url = new char[size]; 
2

strcpy是不安全的,因爲可能發生緩衝區溢出。使用strncpy您準確提供要複製的字節數。您需要爲目標緩衝區分配內存,並添加尾隨\0

std::string strInsert("news"); 
std::string sup("http://www."); 
sup += strInsert + "yahoo.com"; 

char* url = new char[sup.length() + 1]; 
strncpy(url, sup.c_str(), sup.length()); 
url[sup.length()] = '\0'; 
// ... use url 
delete[] url; 
1

如果你真的需要從一個std的內容複製焦炭:: string的的讀寫緩存,您可以使用std::vector<char>

std::vector<char> urlAsVec(sup.begin(), sup.end()); 
urlAsVec.push_back('\0'); 
char * url = &urlAsVec[0]; // pointer you can safely write to 

也可初始化向量是這樣的:

std::vector<char> urlAsVec(sup.c_str(), sup.c_str() + sup.size() + 1); 

這會寫你的空終止對你來說太。

另一種選擇:

std::vector<char> urlAsVec(sup.size() + 1); 
sup.copy(&urlAsVec[0], sup.size()); 

請注意,您的載體會自動將其所有元素初始化爲0,這樣空終止將在那裏即使sup.copy()不寫。無論如何,你可以使用sup.copy(ptr, len)而不是strcpy,雖然你仍然必須手動編寫空終止符(或者已經分配了它),但你可以指定緩衝區大小(儘管strncpy也可以)。

例如,如果您使用此:

char url[ BUFLEN ] = {0}; 
sup.copy(url, BUFLEN-1); 

對於一些固定的值BUFLEN你會得到寫入到您的緩衝區源字符串的副本或部分副本。請注意,我的初始化確保您的所有寫入的字節爲0

0
std::string sup = "news"; 
sup="http://www."+sup+"yahoo.com"; 
char* url = new char[sup.length()+1]; 
url = const_cast<char*>(sup.c_str()); 
url[sup.length()] = '\0'; 

std::cout<<url;   //http://www.newsyahoo.com 

通知的'\0'在網址的結尾。

3

在我看來有兩種方法可以做到這一點。

  1. 使用& - 運算符(號)

    string str = "hello"; 
    char *p; 
    p = &str[0]; 
    
  2. 使用c_str()函數

    string s = "hello"; 
    const char *p; 
    p = s.c_str(); 
    

我已經測試了,他們都正在努力。如果我錯了,請糾正我。

+0

它可能工作時,你測試它,但第一個是有點破解,並不能保證工作。例如。如果字符串的內部表示形式是塊的列表而不是單個內存塊,那麼當您嘗試此操作時,您不會得到整個字符串。因此存在c_str()來強制字符串創建一個單獨的內存塊並將其零終止。 – Bryan 2012-09-15 21:06:36

+0

這是最好的解決方案。 – 2015-11-10 15:31:52