0xC0000005:访问冲突读取位置0xccccccc0

时间:2013-12-03 01:55:42

标签: c++ parsing

执行此功能时,会弹出一条错误消息,指出访问冲突读取位置指向dbgdel.cpp中的第58行。为什么是这样?我似乎无法在我的代码中发现问题。

int parse140(string str_array[], int array_size, string str, int &i)
{   
int word_begin = 0;
int length = 0;

while(word_begin <= str.rfind(" ") && i < array_size)
{
word_begin = word_start(str, word_begin);   
length = word_length(str, word_begin);

if(length < 0)
    length = str.length() - word_begin;
if(i == array_size)
    break;

str_array[i]= str.substr(word_begin, length);
i++;
}   
return i;
}

1 个答案:

答案 0 :(得分:2)

您永远不会更改while循环的条件。

每次你的循环围绕它循环总是找到一个字符串中的最后一个空间,它永远不会在整个循环体中发生变化。这会导致您重复找到相同的单词,每次将其附加到阵列中的下一个插槽,直到您的插槽用完为止。因为你永远不会检查i索引对array_size来阻止这种疯狂,所以你最终会超出你的数组并直接进入未定义的行为

int parse140(string str_array[], int array_size, string str, int &i)
{
    int word_begin = 0;
    int length = 0;

    while(word_begin <= str.rfind(" ")) // str NEVER changes
    {
        word_begin = word_start(str, word_begin);

        //check if word_begin is less than 0.. break
        if(word_begin < 0)
            break;
        length = word_length(str, word_begin);

        if(length < 0)
            length = str.length() - word_begin;

        str_array[i]= str.substr(word_begin, length);

        i++;
    }

    return i;
}

老实说,解决这个问题的最快方法就是不要这样做。如果我面对这个,我会这样做,你可能会发现更多......简短:

#include <iostream>
#include <sstream>

int parse140(std::string str_array[], int array_size, std::string str, int &i)
{
    std::istringstream iss(str);
    for (i=0; i<array_size && (iss >> str_array[i]); ++i);
    return i;
}

替代方法

不使用字符串流,使用算法库仍然相当合理,剥离所有空格并仅提取单词。

int parse140(string str_array[], int array_size, string str, int &i)
{
    std::string::iterator it = str.begin();
    for (i=0; i<array_size && it != str.end(); ++i)
    {
        // locate first non-whitspace character
        it = std::find_if_not(it, str.end(), is_space());
        if (it != str.end())
        {
            // find first whitespace or end-of-string
            std::string::iterator itEnd = std::find_if(it, str.end(), is_space());
            str_array[i].assign(it, itEnd);
            it = itEnd;
        }
    }
    return i;
}