getline的分段错误

时间:2012-11-23 15:23:40

标签: c++ segmentation-fault

我正在编写解决填字游戏的简单程序。我使用getline从输入加载填字游戏,但我得到奇怪的“Segmenation fault”消息,我真的不知道如何处理它。这是代码:

#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:
+----+
|  * |
|    |
| *  |
+----+

一切都很好,直到我进入第二个+ ---- +剧本停止的地方,然后我得到分段错误。有谁可以帮助我吗?

2 个答案:

答案 0 :(得分: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矩阵。

答案 1 :(得分: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();