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