不知道为什么会出现分段错误

时间:2015-11-27 20:28:20

标签: c++ segmentation-fault

我试图在Xcode中使用C ++来解决The Grid Search,并且有一些奇怪的输出。

我的代码:

'drop';

测试案例1:

#include <iostream>
#include <vector>

using namespace std;

int main(){
    int tCases;
    cin >> tCases;
    for(int i = 0; i < tCases; i++){
        bool isFound = false;
        int row = 0, column = 0, tRow = 0, tColumn = 0, p = 0;
        cin >> row >> column;
        vector<string> matrix(row);
        for (int i = 0; i < row; i++) {
            cin >> matrix[i];
        }
        cin >> tRow >> tColumn;
        vector<string> tMatrix(tRow);
        for (int i = 0; i < tRow; i++) {
            cin >> tMatrix[i];
        }
        vector<long> position(tRow);
        for (int i = 0; i <= row - tRow; i++) {
            position[p] = matrix[i].find(tMatrix[p]) ;
            if (position[p] == string::npos) {
                isFound = false;
                p = 0;
            }
            else if (p != tRow && (p == 0 || position[p] == position[p-1])) {
                isFound = true;
                p++;
            }
            else if (p == tRow)
                break;
        }
        cout << (isFound ? "YES" : "NO") << endl;
    }
    return 0;
}

我的输出&amp;预期产出:

  

NO

测试案例2:

1
20 20
34889246430321978567
58957542800420926643
35502505614464308821
14858224623252492823
72509980920257761017
22842014894387119401
01112950562348692493
16417403478999610594
79426411112116726706
65175742483779283052
89078730337964397201
13765228547239925167
26113704444636815161
25993216162800952044
88796416233981756034
14416627212117283516
15248825304941012863
88460496662793369385
59727291023618867708
19755940017808628326
7 4
1641
7942
6517
8907
1376
2691
2599

我的输出&amp;预期产出:

  

YES

有趣的是,当我尝试同时检查两个测试用例时,它只是给我第一个测试用例的输出,然后继续运行而没有显示任何内容。 HackerRank表示它有分段错误。但是,我在CLion中运行组合测试用例并且工作正常。你能帮我找一下代码中的错吗?

2 个答案:

答案 0 :(得分:1)

for (int i = 0; i <= row - tRow; i++)
{
    position[p] = matrix[i].find(tMatrix[p]) ;
    if (position[p] == string::npos)
    {
        isFound = false;
        p = 0;
    }
    else if (p != tRow && (p == 0 || position[p] == position[p-1])) 
    {
        isFound = true;
        p++;
    }
    else if (p == tRow)
        break;
    }
}

这可能导致seg错误:

  • 如果p到达tRow-1(为什么不呢!)然后如果position[p] == string::npos(为什么不呢!),那么您输入第一个else if语句并执行:isFound = true; p++;

  • 然后,下一次迭代,ptRow(当你递增它时),然后你将测试(position[p] == string::npos)。访问position索引tRow,该索引超出范围。

循环条件

for (int i = 0; i <= row - tRow; i++)

应替换为

for (int i = 0; (i <= row - tRow) && (p < tRow); i++)

以防止这种情况发生。然后您可以简单地删除else语句(if (p == tRow) break;)。

答案 1 :(得分:1)

你不在一个人;

替换

data = data.frame(x=rnorm(10,10,1),y=rnorm(10,1,1))
minData<-min(data)
maxData<-max(data)
cols=colorRampPalette(c("red", "green"))(99)
dataCols = apply(data,c(1,2),FUN=function(x){paste('<p style="background-color:',cols[cut(x, breaks = seq(minData, maxData, len = 100), include.lowest = TRUE)],'">',x,'</p>',sep = "")})
HTML(dataCols)

通过

    else if (p == tRow)
        break;