4

我在使用我自己的类的实例时遇到strcpy了一些麻烦。vector这是课程:

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

所以,我从这个类中制作了一个向量:

vector<elemente> ele(1);  

但是,如果我尝试执行此操作:

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

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

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

我能做些什么?

4

1 回答 1

3

由于您使用的是 C++,因此您应该使用该语言为您提供的功能,而不是使用 C 风格的代码。很高兴您决定使用std::vectorso continue 并std::string用于存储字符串、std::istringstream创建输入流,您将从中读取令牌并std::getline实际检索这些令牌。

首先,使用访问说明符 public使类的属性在elemente此类范围之外可用,并将类型更改namestd::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;
    // ...
};

然后对令牌的解析将变为:

for (std::string word; std::getline(lineStream, word, ' '); )
{
    if (!word.empty())
        elements.push_back(elemente(word));
}

希望这可以帮助 :)

于 2013-02-23T11:31:07.660 回答