-3

我正在编写简单的程序来解决填字游戏。我正在使用 getline 从输入中加载填字游戏,但我收到奇怪的“分段错误”消息,我真的不知道该怎么处理它。这是代码:

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;


int** allocateCross(int rows, int columns)
{
    int ** cross = new int*[rows];
    for(int i=0;i<rows;i++)
    {
        cross[i] = new int[columns];    
    }
    return cross;
}
void changeValue(int **cross, int rowPosition, int columnPosition, int value)
{
    cross[rowPosition][columnPosition] = value;
}
void printCross(int ** cross, int rows, int columns)
{
    for(int i=0;i<rows;i++){
        for(int j=0;j<columns;j++){
            cout << cross[i][j];
        }
        cout << endl;
    }

}
void setCross(int ** cross, int rows,int columns, int spaces[], int numberOfSpaces)
{
        for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            changeValue(cross, i, j, 0);

        }
        for(int i=0;i<(numberOfSpaces*2);i=i+2)
        {
            changeValue(cross, spaces[i], spaces[i+1],1);
        }

    }
}
int testString(string stringToTest, const string allowedChars)
{
    size_t found = stringToTest.find_first_not_of(allowedChars);
    if(found != string::npos)
        return false;
    else
        return true;
}

void wrongInput()
{
    cout << "Wrong input." << endl;
    exit(0);
}
int main()
{
    string line;
    string top;
    string line_r;
    bool stringTester;
    int columns = 0;
    int rows = 0;
    getline(cin,line);
    if(line!="Enter crossword:")
        wrongInput();
    getline(cin,line);
    stringTester = testString(line,"+-");
    if(stringTester != true)
        wrongInput();
    top = line;
    top.erase(top.begin());
    top.erase(top.begin()+(top.size()-1));
    rows = top.size();
    top = line;
    getline(cin,line);
    while(line != top)
    {
        columns++;
        getline(cin,line);
    }


    int ** cross = allocateCross(rows,columns);
    //int spaces[]={};
    setCross(cross,rows,columns,spaces,0);
    printCross(cross,rows,columns);


    return 0;
}

唯一重要的部分是 while 循环。当我输入此输入时:

Enter crossword:
+----+
|  * |
|    |
| *  |
+----+

一切都很好,直到我进入脚本应该停止的第二个++----+,然后我得到分段错误。有人能帮助我吗?

4

2 回答 2

4

首先,阅读所写的评论。

问题似乎在这里:

for(int i=0;i<6;i++){
    for(int j=0;j<6;j++){
        changeValue(cross, i, j, 0);
    }
}

为什么这个值 ( 6) 是硬编码的?为什么6而不是42?示例中的填字游戏有三行四列 (3x4),但循环通过 6x6 矩阵。

于 2012-11-23T15:32:33.473 回答
0

下面的代码看起来不对。它是否会导致实际的崩溃我不能说,但首先你+从顶行的开头和结尾删除,然后你等待一条等于修改后的顶行的行,它永远不会出现。

top.erase(top.begin());
top.erase(top.begin()+(top.size()-1));
....
while(line != top)

此外,尝试了解布尔值是什么以及它们是如何工作的。你的testString函数应该这样写:

bool testString(string stringToTest, const string allowedChars)
{
    return stringToTest.find_first_not_of(allowedChars) != string::npos;
}

这三行:

stringTester = testString(line,"+-");
if(stringTester != true)
    wrongInput();

可以简化为

if(!testString(line,"+-"))
    wrongInput();
于 2012-11-23T15:36:13.547 回答