程序接收信号SIGSEGV,分段故障。使用vector <string>时

时间:2017-04-25 18:38:03

标签: c++

嘿,我想创建一个程序来解决文件中的迷宫,并在我使用vector<string>的程序中加载文件,它显示了SIGSEGV,Segmentation fault。

#include <bits/stdc++.h>
using namespace std;

vector<string> labyrinth;
bool visited[100][100];
void printlav(vector<string> s)
    {
        for(int i = 0; i < s.size(); i++)
    {
        for(int j = 0; j < s.at(i).size(); j ++)
        {
            cout << s[i][j];
        }
        cout << "\n";
    }
}
vector<string> solve(vector<string> s,int x,int y)
{
    printlav(s);
    if(s[x][y] == 'K')
    {
        return s;
    }
    if(s[x - 1][y] != '#' && !visited[x - 1][y])
    {
        s[x - 1][y] = '+';
        visited[x - 1][y] = 1;
        s = solve(s, x - 1, y);
    }
    if(s[x + 1][y] != '#' && !visited[x + 1][y])
    {
        s[x + 1][y] = '+';
        visited[x + 1][y] = 1;
        s = solve(s, x + 1, y);
    }
    if(s[x][y -1] != '#' && !visited[x][y - 1])
    {
        s[x][y - 1] = '+';
        visited[x][y - 1] = 1;
        s = solve(s, x, y - 1);
    }
    if(s[x][y + 1] != '#' && !visited[x][y + 1])
    {
        s[x][y + 1] = '+';
        visited[x][y + 1] = 1;
        s = solve(s, x, y + 1);
    }
}
int main()
{
    string line;
    int row = 0, rs,ks;
    ifstream file_("write_here.txt");
    if(file_.is_open())
    {
        while(getline(file_, line))
        {
            labyrinth.push_back(line);
            for(int i = 0; i < line.size(); i++)
            {
                if(line[i] == 'P')
                {
                    rs = row;
                    ks  = i;
                }
            }
            row ++;

        }
        labyrinth = solve(labyrinth, rs, ks);
        for(int i = 0; i < labyrinth.size(); i++)
        {
            for(int k = 0; k < labyrinth[i].size(); k++)
            {
                cout << labyrinth[i][k];
            }
        }
        file_.close();

    }
    else
        cout << "File isn't open";
}

1 个答案:

答案 0 :(得分:0)

此代码中存在很多问题,但我想分段库来自数组索引超出范围。

需要考虑的一些事项:

  1. 始终初始化变量(如果文件不包含任何'P',那该怎么办?...)
  2. 一定要确定(=如果你不是,那么请检查代码!)你不能访问不存在的数组元素(检查你想检查的索引是否在0到99之间)
  3. 就像@NathanOliver指出的那样,使用向量的值递归调用可能会导致堆栈溢出。但是目前你的算法取决于你的方法中有一个迷宫的副本。如果这是分段库的原因,则需要重新考虑算法。
  4. 在printlav中,您可以自己打印每个字符。您可以通过cout&lt;&lt;打印整行。 s [i]&lt;&lt; ENDL;
  5. 在解决中我想你应该返回s并且想想你是否想要或者是否在那个函数中(idk关于你的算法)
  6. 如果在考虑第2点和第3点之后仍然出现分段保险库(或者如果要查找导致分段保险库的行),则可以调试代码。但是,可以通过将一些调试消息打印到控制台上来提供第一个快速印象(就像解决方法中每个“if”语句之前的消息)。这样您就可以轻松找到分段库的原因。