我在使用strcpy
和我自己班级的vector
个实例时遇到了一些麻烦。这是班级:
class elemente {
char name[5];
short val;
bool red;
};
所以,我从这个班级做了一个矢量:
vector<elemente> ele(1);
但如果我尝试做这个操作:
strcpy(ele.back().name, strtok(line, " "));
我总是得到分段错误。为什么呢?
我使用GDB调试我的程序,line
变量是正确的,如果我用正常char *
替换矢量一切正常(程序不起作用,但是内容没问题。)
我该怎么办?
答案 0 :(得分:2)
由于您使用的是C ++,因此您应该使用此语言提供的功能,而不是使用C风格的代码。你最好决定使用std::vector
,所以继续并使用std::string
来存储字符串,std::istringstream
用于创建一个输入流,你将从中读取令牌,std::getline
实际上检索这些令牌。
首先,使用访问说明符 public
使elemente
类的属性在此类范围之外可用,并更改{{1}的类型} name
:
std::string
然后从行中检索标记可能如下所示:
class elemente
{
public:
std::string name;
// ...
};
要测试此代码,您只需打印存储在此向量元素中的所有名称:
#include <iostream>
#include <vector>
#include <sstream>
...
std::vector<elemente> elements;
std::string line("this is my input line");
std::istringstream lineStream(line);
for (std::string word; std::getline(lineStream, word, ' '); )
{
if (!word.empty())
{
elements.push_back(elemente());
elements.back().name = word;
}
}
输出:
std::vector<elemente>::iterator e;
for(e = elements.begin(); e != elements.end(); ++e)
std::cout << e->name << ".";
或者,您可以创建类的公共构造函数,以便可以使用正确初始化的成员构造元素:
this.is.my.input.line.
然后解析令牌将成为:
class elemente
{
public:
elemente(const std::string& s) : name(s){ }
// ...
std::string name;
// ...
};
希望这会有所帮助:)