2014-04-01 99 views
0

我嘗試使用此算法將字符串轉換爲數組。 問題是這樣的:strcpy不起作用。將字符串轉換爲數組,strcpy不起作用

我也嘗試: strcpy_s 函數strncpy 的memcpy - >這個功能我的數組只能打印第一個字(說不上來爲什麼)...

string tmp; 
getline(cin, tmp); 
char* messaggio = new char[tmp.size()]; 
ZeroMemory(messaggio, tmp.size()); 
strcpy(messaggio, tmp.c_str()); 

tmp.resize(NULL); 

我使用Visual Studio 2013 ... 當我嘗試使用strcpy我有一個奇怪的錯誤:C4996可能是不安全的。 如果我嘗試與strcpy_s是相同的,與strncpy相同...

+0

你所提到的有關打印僅第1個字和第2個是C4996編譯錯誤。您是否收到編譯錯誤,或者您正在獲取意外的運行時輸出。兩者都是不同的問題。 –

+0

對於編譯錯誤(C4496),您從這裏閱讀了關於如何禁用它的信息。 http://msdn.microsoft.com/en-us/library/ttcz0bys.aspx –

+0

@tmp這是一個錯誤,或只是一個警告? –

回答

0

[解決]

THX可言,expecially爲 「弗拉德從莫斯科」:3

std::string tmp; 
     tmp.resize(0); 
     std::getline(std::cin, tmp); 
     char* messaggio = new char[tmp.size()+1]; 

     strcpy_s(messaggio, tmp.size()+1, tmp.c_str()); 

     send(ConnectSocket, messaggio, tmp.size()+1, NULL); //Send 2 

     tmp.resize(0); 
     delete messaggio; 
2

在您的代碼中的一個問題是,string::size給你的字符數不包括空終止。所以messagio沒有足夠的空間來存儲一個以nul結尾的字符串,並且strcpy將嘗試寫入超出其範圍。

至於警告,這是因爲strcpy使得它很容易出界。如果源字符串的長度大於目標緩衝區的長度,則會出現未定義的行爲。建議的替代方案爲您提供了保護自己的手段(但不是100%的傻瓜)。

如果你想要的是包含字符串,那麼慣用的方式做到這一點的字符數組類的對象是使用向量:

std::vector<char> messagio(tmp.begin(), tmp.end()); 

如果你真的想要一個字符串,然後只需使用std::string即可。

+0

另一個問題是代碼將不可避免地泄漏內存。他應該爲他的C風格字符串使用'std :: vector '。 –

+0

THX烏拉圭回合的幫助,但我的概率是不是字符串而是數組... INFACT我需要把字符串,向量,列表...到一個數組,而不是相反... – user3464250

+0

@ user3464250但是爲什麼你必須這樣做?你的問題並不清楚,所以你可能並不需要它。 – juanchopanza

0

你得到的錯誤實際上不是錯誤。這是一個警告。也許你設置了編譯器的選項,強制編譯器將所有警告視爲錯誤。

您的代碼有一個錯誤。分配數組的大小應比以適應使用功能std::strcpy

所以終止零字符串的尺寸更大的一個,你應該寫

std::string tmp; 
std::getline(std::cin, tmp); 

char* messaggio = new char[tmp.size() + 1]; 
std::strcpy(messaggio, tmp.c_str()); 

或者你可以寫

strcpy_s(messaggio, tmp.size() + 1, tmp.c_str()); 

雖然函數strcpy_s不是標準的C++函數。它只出現在C標準中。

我相信你應該忽略這個警告。

如果您的編譯器支持類std::dynarray您可以使用它而不是原始指針。

例如

std::dynarray<char> messagio(tmp.size() + 1); 
std::strcpy(messagio.data(), tmp.c_str()); 
+0

謝謝,但問題仍然是... 的DynArray不支持我想...... 反正我需要一個指針原因後,我將使用將指針接收爲參數的功能。 \t爲(;;){ \t \t的std :: string TMP; \t \t std :: getline(std :: cin,tmp); \t \t char * messaggio = new char [tmp.size()+ 1];\t \t ZeroMemory(messaggio,tmp.size()+ 1); \t \t std :: strcpy(messaggio,tmp.c_str()); \t \t發送(ConnectSocket,messaggio,tmp.size(),NULL); \t \t tmp.resize(NULL); \t} – user3464250

+0

我不明白你在說什麼問題>爲什麼您使用ZeroMemory當在我的例子中沒有這樣的電話嗎?函數send temp.size()或tmp.size()+ 1應該使用什麼值? –

+0

嘗試使用和不使用ZeroMemory,但仍然沒有任何...我還採取了另一個項目(類似於此),並查看菜單中的選項是否相同...它是!當我回到家時,我會看到更多的注意力,但我認爲選項是好的.....我也試着用tmp.size()和tmp.size()+ 1並沒有改變:/:/:/ :/ – user3464250