将 C++ 字符串存储到 char* 向量中

storing a c++ string into a char* vector

本文关键字:向量 char C++ 字符串 存储      更新时间:2023-10-16

我正在尝试将此字符串存储到指针向量中。这只是代码的起点。最终,向量将存储用户键入的单词,如果矢量没有单词,则将其添加到矢量中,或者显示单词已在矢量中。

我尝试使用 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

正如人们在评论中提到的,您可以使用以下 2 个选项之一:-

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]具有未定义的行为,因为您正在越界访问。

返回对指定位置处的元素的引用。 不执行边界检查。

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

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

当然,最明智的做法是只使用vectorstrings

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

您正在尝试手动管理字符串的内存,而std::string类旨在为您执行此操作。

此外,从您描述的用例来看,您可能希望查看std::map和/或std::set。这是一个教程。