[英]Convert string to array, strcpy don't work
我嘗試使用此算法將字符串轉換為數組。 問題是這樣的: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相同...
您的代碼中的一個問題是string::size
為您提供了除空終止之外的字符數。 因此, messagio
沒有足夠的空間容納一個以空字符結尾的字符串,而strcpy
會嘗試超出其范圍。
至於警告,這是因為strcpy
使它很容易走出界限。 如果源字符串的長度大於目標緩沖區的長度,則會得到未定義的行為。 建議的替代方案為您提供了保護自己的手段(但不是100%萬無一失)。
如果你想要的是一個包含字符串字符的類數組對象,那么執行此操作的慣用方法是使用向量:
std::vector<char> messagio(tmp.begin(), tmp.end());
如果你真的想要一個字符串,那么只需使用std::string
。
你實際上得到的錯誤不是錯誤。 這是一個警告。 也許您設置了編譯器的選項,強制編譯器將所有警告視為錯誤。
您的代碼有錯誤。 分配的數組的大小應該大於字符串的大小,以容納函數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() );
[解決了]
總而言之,特別是“來自莫斯科的弗拉德”: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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.