0

大きな文字列からサブ文字列を取得しようとしていますが、小さなプログラムで動作するようになりましたが、実際のプログラムで実行しようとするとうまくいきません。私は他の誰かの機能を構築しており、それを自分の目的のために機能させていますが、必要なメインプログラムで機能させることができません。エラーが発生していると思われる場所にプログラムを制限します。

問題: 関数 findStats(std::string sString) に同じ値を渡しましたが、異なる結果が得られました。ケース I:

stats = findStats("^9dff9d[Attribute 0% Active Defense 0]\r^f2f3f2Mana: 1411 ^00ff00(+1975)\r^f2f3f2^9dff9d[Attribute 0% Active Mana 0]\r^f2f3f2^ffc000Fortify Level: 12/12\r^f2f3f2^006effIdentified Attribute: + 6% Crit Damage\rIdentified Attribute: + 6  Accuracy\r^f2f3f2^006eff^O053Sacrifice Elapse(6/8)\r^00ff00  ^O041Desollar's Shadow\rÌÌÌÌÌÌÌÌL«");

上記の場合、正しく出力され、\r オフセットが正しく保存されます。

ケース II:

stats = findStats((std::string)((char*)&buffer));

ケース II は、私が作業する必要があるケースであり、関数 findStats の開始時に上記のケース I と同じ値を持ちますが、sString が関数の開始時に同じ値を持つ場合、\r のオフセットは保存されません。

    //Function that finds positioning of \r

void calc_z (std::string &s, std::vector<int> & z)
{
int len = s.size();
z.resize (len);

int l = 0, r = 0;
for (int i=1; i<len; ++i)
    if (z[i-l]+i <= r)
        z[i] = z[i-l];
    else
    {
        l = i;
        if (i > r) r = i;
        for (z[i] = r-i; r<len; ++r, ++z[i])
            if (s[r] != s[z[i]])
                break;
        --r;
    }
}


std::vector<std::string> findStats(std::string sString){
//sString is exactly the same in value for both cases of stats at this point
int offSet = 0;
int sOffsets[100] = {};

std::vector<std::string> t1;
std::string main_string = sString;
std::string substring = "\r";
std::string working_string = substring + main_string;
std::vector<int> z;
calc_z(working_string, z);

for(int i = substring.size(); i < working_string.size(); ++i){
    if(z[i] >=substring.size()){
        sOffsets[offSet] = i;
        offSet++;
    }
}
.... code ....problem occurs right above offsets are not stored for \r
}

void main()
{   
std::vector<std::string> stats;
std::string buffer[10];

    ...code...
    ...code to find string and store in buffer...



stats = findStats((std::string)((char*)&buffer));
//stats = findStats("^9dff9d[Attribute 0% Active Defense 0]\r^f2f3f2Mana: 1411 ^00ff00(+1975)\r^f2f3f2^9dff9d[Attribute 0% Active Mana 0]\r^f2f3f2^ffc000Fortify Level: 12/12\r^f2f3f2^006effIdentified Attribute: + 6% Crit Damage\rIdentified Attribute: + 6  Accuracy\r^f2f3f2^006eff^O053Sacrifice Elapse(6/8)\r^00ff00  ^O041Desollar's Shadow\rÌÌÌÌÌÌÌÌL«");
for( std::vector<std::string>::const_iterator i = stats.begin(); i != stats.end(); ++i)std::cout << *i << ' ' << std::endl;

std::cin.get();

}
4

1 に答える 1

0

このステートメント:(std::string)((char*)&buffer)は、あなたが思っていることをしません。

  1. std::vector単純な配列ではありません。
  2. のアドレスを取得するとstd::vector、それは 内の最初の要素のアドレスにはなりませんstd::vector
  3. const char*キャストしたりchar*、std::string にキャストしたりすることはできません。ただし、指定された文字列またはC スタイルの文字列std::stringを使用してnew を作成することはできます。.const char*char *const char *str = asdf; std::string s = std::string(str);

要約すると、次のようになります。

  1. で一度に複数の文字列を渡したい場合はstd::vector、バッファを const 参照で渡します

    typedef std::vector<std::string> StringVector;
    
    void test(const StringVector& v){
       for (StringVector::const_iterator i = v.begin(); i != v.end(); i++)
           std::cout << *i << std::endl;
    }
    
    ...
    
    StringVector strings;
    test(strings);
    
  2. に何かを書き込みたい場合はstd::vector、参照で渡します。

    typedef std::vector<std::string> StringVector;
    
    void test(const StringVector& out){
       out.push_back("test");
    }
    
    ...
    
    StringVector strings;
    test(strings);
    
  3. vector から 1 つの文字列を渡したい場合は、キャストせずに、要素自体を渡すだけです (参照、const 参照、または値によって、何をしたいかによって異なります)。

    typedef std::vector<std::string> StringVector;
    
    void test(const std::string& s){
       std::cout << s << std::endl;
    }
    
    ...
    
    StringVector strings;
    strings.push_back("test");
    test(strings[0]);
    

- 編集 -

それに加えて:

std::vector<std::string> findStats(std::string sString){
//sString is exactly the same in value for both cases of stats at this point
int offSet = 0;
int sOffsets[100] = {};//<<here's a problem

この場合、固定サイズの配列を使用することはお勧めできません。配列が小さく、100 バイトを超える文字列でオーバーフローし、プログラムが壊れたりクラッシュしたりします。目的に応じて、単純に に結果を保存しstd::vectro<std::string>たり、構造体のベクトルを作成したり、 を使用したりできます。std::map

于 2013-11-11T07:30:29.670 に答える