簡體   English   中英

將字符串轉換為數組,strcpy不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM