2017-07-26 88 views
1

我試圖將此字符串存儲到指針向量中。這只是代碼的起點。最終,矢量將存儲用戶輸入的單詞,並且如果矢量沒有它或者顯示單詞已經在矢量中,則將它添加到矢量中。將C++字符串存儲到char *向量中

我試圖使用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]; 
+2

儘管訪問了'wordBank [0]'',您從未在'wordBank'向量中保留任何空格。嘗試使用'vector wordBank(1);' – user0042

+1

或使用'wordBank.push_back(new char [str.length()+ 1]);'代替代碼。 – songyuanyao

+5

我想我們不能讓你成爲一個很好的'string'矢量',我們可以嗎? – user4581301

回答

1

一個vector的默認大小爲0

因此這條線

vector<char*> wordBank; 

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

當人們提到在評論中你可以使用其中任何一個2個選項: -

vector<char*> wordBank(1); 

OR

wordBank.push_back(...); 
0

你並不需要在矢量char*元素。您可以使用string代替,並添加你的字符串到矢量與push_back(),這將分配所需的空間:

vector<string> wordBank; 
string str; 

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

這將釋放你不必負擔使用delete要刪除一個字符串每次從矢量。基本上,你不應該在任何事情上使用delete,爲了達到這個目的,你應該避免使用new來分配內存。在這種情況下,這意味着要避免使用new char[/*...*/],這意味着您應該使用string來存儲字符串。

0

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

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

您可以使用push_back添加新的元素,例如:

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

當然是最明智的做法是隻用使用vectorstrings

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

你」重新嘗試手動管理你的字符串的內存,而std::string類是爲你設計的。

此外,從您所描述的用例來看,您可能希望查看std::map和/或std::set。這是一個tutorial

2

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

C++中的標準庫可以讓你的生活更輕鬆。您應該使用std::vector<std::string>。它避免了所有指針的東西,所以你不需要做內存管理(這是擺脫指針的好理由)。

對於strcpy_s,這是一個更安全的版本strcpy,因爲您必須明確指定目標緩衝區的大小,這可以避免複製期間的緩衝區溢出。

然而,strcpy_s是非標準和MS具體,NEVER使用strcpy_s,除非你只是想編上MSVS您的代碼。改爲使用std::copy