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

时间:2017-07-26 00:56:40

标签: c++ 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];

4 个答案:

答案 0 :(得分:2)

我不会考虑vector<char*> wordBank;这个c ++代码,而是考虑使用某些C ++功能的C代码。

C ++中的标准库可以让您的生活更轻松。您应该使用std::vector<std::string>代替。

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

它避免了所有的指针内容,所以你不需要做内存管理(这是摆脱指针的一个很好的理由)。

对于strcpy_s,它是strcpy的更安全版本,因为您必须明确指定目标缓冲区的大小,这可以避免复制期间的缓冲区溢出。

但是,strcpy_s是非标准且MS特定的,从不使用strcpy_s,除非您只想在MSVS上编译代码。请改用std::copy

答案 1 :(得分:1)

  

vector的默认大小为0

因此这一行

vector<char*> wordBank;

只定义一个0大小的vector个字符指针

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

  vector<char*> wordBank(1);

OR

wordBank.push_back(...);

答案 2 :(得分:0)

您不需要向量中的// Controller.js exports.user_read = async id => { return Contact.findById(id, (err, user) => { err ? reject(err) : resolve(user); }); } // Resolver.js var contact = require('Controller'); ... // root object passed as rootValue to graphqlHTTP getUser: ({ id }) => { return await contact.user_read(id) } ... 个元素。您可以改为使用char*,并将字符串附加到带string的向量,这将分配所需的空间:

push_back()

每次要从向量中删除字符串时,这将免除您必须使用vector<string> wordBank; string str; cin >> str; wordBank.push_back(str); cout << wordBank[0]; 的负担。基本上,您不应该对任何事情使用delete,要实现这一点,您应该避免使用delete分配内存。在这种情况下,这意味着避免使用new,这反过来意味着您应该使用new char[/*...*/]来存储字符串。

答案 3 :(得分:0)

let test = (0...3).prefix { $0 > 1 } test.contains(0) // false test.contains(3) // false 构造一个空向量。因此,使用operator[]vector<char*> wordBank;具有未定义的行为,因为您正在访问越界。

  

返回对指定位置pos处元素的引用。没有进行边界检查。

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

wordBank[0]

当然最明智的做法就是使用wordBank.push_back(new char[str.length + 1]); vector

strings

您尝试手动管理字符串的内存,而std::string类则是为您设计的。

此外,根据您描述的用例,您可能希望查看std::map和/或std::set。这是tutorial