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::vector使用することを決定したのは良いことです。std::stringstd::istringstreamstd::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 に答える