2013-02-24 55 views
0

問題是我的控制檯應用程序從用戶得到的字符串:轉換輸入字符串爲char * <Bad Ptr>

string input; 
cin >> input; 

現在我想這個字符串轉換爲char *,然後將它傳遞給一個函數:

char *argument = NULL; 
argument = (char *) input.c_str(); 

我的函數聲明爲:

int function (char *input, char *output) 

我有訪問衝突時,DEB這個代碼,所以我試圖定義一切:

strcpy(argument, input.c_str()); 

但我再次訪問衝突和壞Ptr! 任何線索?

回答

1
argument = (char *) input.c_str(); 
      ^^^^^^^^ you don't need this. further c_str() returns a "const pointer to char" 
        not "pointer to char". 

int function (char *input, char *output) 
      ^^^^^^^^^^^^|________ It should be "string input" or "string &input" 
+0

我不無法訪問功能代碼:( – A23149577 2013-02-24 10:24:22

3

您的問題是c_str()返回一個const char*,而不是一個char*。您不允許修改c_str()返回的字符序列中的任何字符。

所以,你需要:

const char *argument = input.c_str(); 

你的編譯器會抓住這個錯誤,如果你沒有做演員:

argument = (char *) input.c_str(); 

沒有投:

argument = input.c_str(); 

它不會被編譯(或者它可能會被編譯,但附帶一個大的,重要的警告)。此外,如果稍後修改input,則從c_str()獲得的指針不再有效,並且訪問它也會導致未定義的行爲。

如果你想有一個char*版本字符串,那麼你應該將它複製:

char *argument = new char[input.length() + 1]; 
std::strcpy(argument, input.c_str()); 

不要忘記釋放argument當你不再需要它:

delete[] argument; 
+0

@Arpit http://www.cplusplus.com/reference/string/string/c_str/ – 2013-02-24 09:27:02

+0

哦,是的,你是對的,我真的忘了它。+ 1 – Arpit 2013-02-24 09:29:14

+0

那麼我該怎麼做是嗎?我沒有權限訪問我的功能代碼,而且我也是它從一個dll,我怎麼可以將輸入字符串從控制檯應用程序傳遞給函數 – A23149577 2013-02-24 10:22:19