执行此功能时,会弹出一条错误消息,指出访问冲突读取位置指向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;
}
答案 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;
}