访问冲突读取位置

访问冲突读取位置

执行此功能时,将弹出一条错误消息,指出指向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;
}

最佳答案

您永远不会更改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;
}

09-25 19:39