簡體   English   中英

將c ++字符串存儲到char *向量中

[英]storing a c++ string into a char* vector

我正在嘗試將此字符串存儲到指針向量中。 這只是代碼的起點。 最終,向量將存儲用戶鍵入的單詞,如果向量沒有它,則將其添加到向量中,或者顯示單詞已經在向量中。

我試圖使用strcpy()但它告訴我使用strcpy_s()。 所以我現在做了,現在它每次都崩潰而沒有錯誤。 有人可以給我一些洞察這里發生的事情。

vector<char*> wordBank;

string str;
cin >> str;

wordBank[0] = new char[str.length() + 1];
strcpy_s(wordBank[0], str.length() + 1 , str.c_str() );

cout << wordBank[0];

delete[] wordBank[0];

我不會考慮vector<char*> wordBank; 這個c ++代碼,而是碰巧使用某些C ++特性的C代碼。

C ++中的標准庫可以讓您的生活更輕松。 您應該使用std::vector<std::string>

vector<string> wordBank;
wordBank.push_back(str);

它避免了所有的指針內容,所以你不需要做內存管理(這是擺脫指針的一個很好的理由)。

對於strcpy_s ,它是strcpy的更安全版本,因為您必須顯式指定目標緩沖區的大小,這可以避免在復制期間緩沖區溢出。

但是, strcpy_s是非標准的並且是MS特定的,除非您只想在MSVS上編譯代碼,否則切勿使用strcpy_s 請改用std::copy

vector的默認大小為0

因此這條線

vector<char*> wordBank;

只定義一個0大小的字符指針vector

正如人們在評論中提到的那樣,您可以選擇以下兩種方案之一: -

  vector<char*> wordBank(1);

要么

wordBank.push_back(...);

您不需要向量中的char*元素。 您可以使用string ,並使用push_back()將字符串附加到向量,這將分配所需的空間:

vector<string> wordBank;
string str;

cin >> str;
wordBank.push_back(str);
cout << wordBank[0];

每次要從向量中刪除字符串時,這將使您免於必須使用delete的負擔。 基本上,你永遠不必對任何東西使用delete ,為了實現這一點,你應該避免使用new分配內存。 在這種情況下,這意味着避免使用new char[/*...*/] ,這反過來意味着你應該使用string來存儲字符串。

vector<char*> wordBank; 構造一個空的向量。 因此,使用operator[] wordBank[0]具有未定義的行為,因為您正在訪問越界。

返回對指定位置pos處的元素的引用。 不執行邊界檢查。

您可以使用push_back添加新元素,如下所示:

wordBank.push_back(new char[str.length + 1]);

當然最明智的事情就是使用一個strings vector

vector<string> wordBank;
wordBank.push_back(str);

您正在嘗試手動管理字符串的內存,而std::string類則是為您設計的。

另外,根據您描述的用例,您可能希望查看std::map和/或std::set 這是一個教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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