我的程序崩溃了,这对我来说很好,当然我的程序说不然,这让我很困惑。
我正在处理的这部分功能片段:
for(int k = 0; k < dictionary[k].size(); k++)
{
//"i" represents the fragment's first character
//while "k" represents the dictionary first character
if(fragments[i][j] == dictionary[k][j]) {
token++;
cout << token << endl;
}
}
可能是问题所在。当我调试问题时,调试器转到代码片段的第一行:
for(int k = 0; k < dictionary[k].size(); k++)
当我尝试下一个时,然后崩溃。 在调试器中,此窗口在我的代码块中打开:
Signal Received
Program Received Singal SIGEGV, segmentation fault. Do you want to view backtrace?
我点击了,这对我来说似乎是武断的。
有谁知道我做错了什么?
如果需要回溯(窗口显示Call Stack),我会在以后编辑它(如果需要)
编辑:这是整个功能,我认为没有必要
void Language::compare()
{
int para = getParameters(0); //eg. 3
int valid = para;
int token = 0;
for(int i = 0; i < para; i++)
{
//If the string is creater than 2 characters
if(fragments[i].length() > 1) {
for(int j = 0; j < fragments[i].length(); j++)
{
//Checking if that character match in dictionary
for(int k = 0; k < para; k++) //Changed and now works,
{
//"i" represents the fragment's first character
//while "k" represents the dictionary first character
if(fragments[i][j] == dictionary[k][j]) { //But now this line crashes
token++;
cout << token << endl;
}
}
if(token == 0) {
break;
}
}
}
else {
//...
}
}
}
字典和片段在“语言”类中声明,它们都是向量。
答案 0 :(得分:10)
我怀疑你打算在那里使用dictionary[k].size()
作为循环控制的一部分,因为循环遍历k
。您的意思是dictionary.size()
还是dictionary[i].size()
?
答案 1 :(得分:7)
这一行:
for(int k = 0; k < dictionary[k].size(); k++)
看起来确实令人怀疑。你确定你不想循环到字典数组/集合的大小吗?
如果您发布了dictionary
的定义,则可能有助于我们提供一些具体的建议。
答案 2 :(得分:1)
fragments[i][j] == dictionary[k][j]
在尝试取消引用dictionary[k].size()>j
之前,您应该确保dictionary[k][j]
。
答案 3 :(得分:0)
进入循环时j的值是多少?
我同意其他人的意见:
for(int k = 0; k&lt; dictionary [k] .size(); k ++)
似乎是假的。像
这样的东西for(int k = 0; k&lt; dictionary [m] .size(); k ++)
似乎更有意义。
答案 4 :(得分:0)
关于for循环中的测试的其他评论可能是正确的,但另外如果你第一次尝试进入循环时遇到这个段错误,那么你可能正在使用{ {1}} dictionary
没有条目。
在这种情况下,vector<>
具有未定义的行为(可能是段错误)。