使用strcpy和std :: vector

时间:2013-02-23 11:08:55

标签: c++ string stdvector strtok strcpy

我在使用strcpy和我自己班级的vector个实例时遇到了一些麻烦。这是班级:

class elemente {  
    char name[5];  
    short val;  
    bool red;  
};

所以,我从这个班级做了一个矢量:

vector<elemente> ele(1);  

但如果我尝试做这个操作:

strcpy(ele.back().name, strtok(line, " "));  

我总是得到分段错误。为什么呢?

我使用GDB调试我的程序,line变量是正确的,如果我用正常char *替换矢量一切正常(程序不起作用,但是内容没问题。)

我该怎么办?

1 个答案:

答案 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;
    // ...
};

希望这会有所帮助:)