我正在编写解决填字游戏的简单程序。我使用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:
+----+
| * |
| |
| * |
+----+
一切都很好,直到我进入第二个+ ---- +剧本停止的地方,然后我得到分段错误。有谁可以帮助我吗?
答案 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();