我试图将此字符串存储到指针向量中。这只是代码的起点。最终,矢量将存储用户输入的单词,如果矢量没有它或者显示单词已经在矢量中,则将其添加到矢量中。
我尝试使用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];
答案 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
类则是为您设计的。