传染媒介问题传染媒介

时间:2011-11-22 06:45:58

标签: c++ list stl vector

我正在尝试遍历一个字符串列表,并找到所述字符串中给定字符所在的位置。然后,我根据字符出现的位置/字符将字符串存储在给定的向量中。在循环完成执行之前,我在以下代码中遇到运行时错误。我已经看过它六次了,似乎找不到任何错误。

vector< vector<string> > p;
for(list< string >::iterator ix = dictionary.begin(); ix != dictionary.end(); ix++)
{
    int index = contains(*ix, guess);
    index++;

    p.at(index).push_back(*ix); //0 will contain all the words that do not contain the letter
                                //1 will be the words that start with the char
                                //2 will be the words that contain the the char as the second letter
                                //etc...
}



int contains(string str, char c)
{
    char *a = (char *)str.c_str();
    for(int i = 0; i < (str.size() + 1); i++)
    {
        if(a[i] == c)
            return i;
    }
    return -1;
}

3 个答案:

答案 0 :(得分:5)

更改

 (str.size() + 1)

...至

 str.size()

你将在str.size()处于未定义的区域,更不用说PLUS了。

就此而言,你为什么要摆弄额外的char *而不是std :: string []?

对于 THAT 问题,为什么不简单地使用std::string::find()

当然,假设您正在使用std :: string而不是其他字符串......:)

实际上,回到调用站点... string :: find()返回目标字符匹配的索引,如果不匹配则返回string :: npos。那么,你能完全省去额外的功能吗?

 int pos = (*ix).find( guess );
 p.at( (  pos == string::npos ) ? 0 : ( pos + 1 ) ).push_back( *ix );

答案 1 :(得分:2)

矢量&lt;矢量&gt; p将p定义为空向量。在使用vector :: at()之前,必须先添加向量元素。 例如:

const size_t MAX_LETTERS_IN_WORD = 30;
vector< vector<string> > p(MAX_LETTERS_IN_WORD);

/* same as before */

作为替代方案,您可以在使用at()和push_back()之前检查p.size(),根据需要将其他元素添加到p中

答案 2 :(得分:2)

运行时错误的问题可能是因为您在尚不存在的位置访问向量p。在访问特定索引之前,必须在向量中留出空间。