字符串操作,完全丢失

时间:2013-11-11 07:03:12

标签: c++

我试图从更大的字符串中获取子字符串,并且我已经让它在一个小程序中工作但是当我尝试将它运行到真正的程序中时它就会出错。我正在建立别人的功能并让它为我的目的而工作,但是无法让它在我需要它的主程序中工作。我将程序限制到我认为错误发生的地方。

问题:我将相同的值传递给函数findStats(std :: string sString)但得到不同的结果。 案例一:

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 \ n偏移。

案例II:

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

案例II是我需要工作的情况,并且具有与上述案例I相同的值,在函数findStats的开始但是\ r的偏移量当sString在函数的开头具有相同的值时,我们没有存储。

    //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();

}

1 个答案:

答案 0 :(得分:0)

此声明:(std::string)((char*)&buffer)不符合您的想法。

  1. std::vector不是一个简单的数组。
  2. 如果您使用std::vector的地址,那将不是std::vector中第一个元素的地址。
  3. 你不能只将const char*char*投射到std :: string中。但是,您可以使用提供的std::stringconst char* c样式字符串构建新的char *const char *str = asdf; std::string s = std::string(str);
  4. 所以,总结一下:

    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传递一个字符串,只需传递元素本身(通过引用,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]);
      
    4. - 编辑 -

      除此之外:

      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,具体取决于您的目标。