2017-07-26 85 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