C++ 数独输入程序跳过提示

C++ 数独输入程序跳过提示,c++,sudoku,C++,Sudoku,我为我的计算机科学课程编写了一个程序,可以验证和解决.txt文件中的数独难题,但我想更进一步,编写一个程序,使输入和数独游戏更容易。我相信你可以根据这段代码找出文件的格式。我唯一的问题是最后一个cin被跳过了,这个选项对我很重要。任何洞察都将不胜感激 #include <iostream> #include <fstream> #include <string> using namespace std; struct s { s(); ~s() {/*zz

我为我的计算机科学课程编写了一个程序,可以验证和解决.txt文件中的数独难题,但我想更进一步,编写一个程序,使输入和数独游戏更容易。我相信你可以根据这段代码找出文件的格式。我唯一的问题是最后一个cin被跳过了,这个选项对我很重要。任何洞察都将不胜感激

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct s {
s();
~s() {/*zzzz*/}
void show_grid();
void set (int &r, int &c, int &v) {g[r][c] = v;}
private:
int g[9][9];
};

//************************************************************************

void s::show_grid() {

//print game out to check it
cout << "  |  -------------------------------  |" << endl;
for (int k=0; k<81; k++) {
    if (k%3 == 0)
        cout << "  |";
    cout << "  " << g[k/9][k%9];
    if (k%9 == 8) {
        cout << "  |" << endl;
        if ((k/9)%3 == 2)
            cout << "  |  -------------------------------  |" << endl;
    }
}
cout << endl;
}

//************************************************************************

s::s() {

//initialize all elements to zero
for (int i=0; i<9; i++) {
    for (int j=0; j<9; j++) {
        g[i][j] = 0;
    }
}
}

//************************************************************************

void create_name (string &name) {

//append .txt extension LIKE IT OR NOT
string ext = name;
ext.erase(ext.begin(), ext.end() - 4);

if (ext.compare(".txt")!=0)
    name.append(".txt");
}

//************************************************************************

int main () {

s g;
string name;
string yon("");
int count = 0;
int row, col, val, rcv;
ofstream os;

cout << "Enter game file name: ";
cin >> name;

create_name(name);

//open and do typical checks
os.open(name.c_str());
if (os.fail()) {
    cerr << "Could not create " << name << ". Waaaah waaaaaaaaaah...\n\n";
    return 0;
}

//useful output (hopefully)
cout << "Enter grid coordinates and value as a 3-digit number,\n"
    << "from left to right, row by row.\n" 
    << "(e.g. 2 in first box would be 112)\n";

//take input as one int, to be user friendly
while (cin >> rcv && count < 81) {
    row = (rcv / 100) - 1;
    col = ((rcv / 10) % 10) - 1;
    val = rcv % 10;
    os << row << " " << col << " " << val << endl;
    g.set (row, col, val);
    count++;
}

os.close();

//From here down is broken, but it still compiles, runs, and works
cout << "Show grid input(y/n)?\n";
cin >> yon;

if (yon.compare("y")==0)
    g.show_grid();
else if (yon.compare("n")==0)
    cout << "Peace!\n";

return 0;
}
#包括
#包括
#包括
使用名称空间std;
结构{
s();
~s(){/*zzzz*/}
void show_grid();
空集(int&r,int&c,int&v){g[r][c]=v;}
私人:
int g[9][9];;
};
//************************************************************************
void s::show_grid(){
//打印游戏以检查它
cout问题在于:

while (cin >> rcv && count < 81)

编辑

根据您上面的评论,您实际上希望读取的值少于81个。在这种情况下,我建议用户输入一个特殊值(例如,0)来终止循环。您只需添加
if(rcv==0)break;
。如果您只是输入了一个无效的值,那么
cin
流将处于失败状态,进一步的输入将不会成功

cin >> yon
仍然实际读入一个变量,它只是读入变量,发现while循环为false。当while循环条件返回false时,rcv被忽略,因此该数字保留在输入流中,等待下一个cin语句。当调用yon时,表示rcv的数字被读入yon,给您带来一些奇怪的错误

最好使用interjay的方法:

while (count < 81 && cin >> rcv)
while(计数<81&&cin>>rcv)
尝试以下方法:

//useful output (hopefully)
cout << "Enter grid coordinates and value as a 3-digit number,\n"
    << "from left to right, row by row.\n" 
    << "(e.g. 2 in first box would be 112)\n"
    << "or Z to end the loop\n";  // 1

//take input as one int, to be user friendly
while (count < 81 && cin >> rcv ) { // 2
    row = (rcv / 100) - 1;
    col = ((rcv / 10) % 10) - 1;
    val = rcv % 10;
    os << row << " " << col << " " << val << endl;
    g.set (row, col, val);
    count++;
}

if(!std::cin) {  // 3
  std::cin.clear();
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
//有用的输出(希望如此)

循环时,你如何终止
循环?你真的键入了81个数字吗?哦,我想这很重要,我只需输入终止循环的任何字符,因为它不是int。81是为了防止用户超出数组的边界,这是你的问题。你故意在cin
——在调用
.clear()
并读取.gotcha中的奇数字符之前,任何进一步的输入操作都无法成功,这是有道理的。最好的解决方案是在(cin>>rcv)
期间执行
,然后检查输入的字符是否过多(或过少,在循环后进行检查)@JamesKanze:但是这个程序在81个值之后接受更多的输入,所以这不起作用。我没有注意到。因为他输入了81个值,很明显这个程序是设计用来读取文件的;没有人手动输入81个值。男孩们,这个程序只创建了一个文件。我写的读取文件的程序完全是分离的ate.@dockleryxk:现在我看到了你上面的评论,我想我理解了你实际上想做什么,请看我的编辑。嗯,我不想输入81个变量,因为我想输入一个尚未解决的谜题,所以空索引将为零。这对我提出的循环有什么影响?循环将继续运行并读取下一个变量,直到它发现count超过81。因为只有不到81个变量得到输入,但它绝对不能超过81位。这是因为数独游戏已经给出了确切的开始值!这就是我需要做的。你只是添加了std范围来获得你的观点吗?还有,STL ignore()仅仅是为了更好的衡量?如果你打算清除cin,那不就是为了完成同样的事情吗?1)我添加了
std:
,因为我教人们永远不要使用
名称空间std;
。2)
忽略()
是必需的。3)即使在清除错误条件后,
Z
仍将在输入流中,必须删除。
//useful output (hopefully)
cout << "Enter grid coordinates and value as a 3-digit number,\n"
    << "from left to right, row by row.\n" 
    << "(e.g. 2 in first box would be 112)\n"
    << "or Z to end the loop\n";  // 1

//take input as one int, to be user friendly
while (count < 81 && cin >> rcv ) { // 2
    row = (rcv / 100) - 1;
    col = ((rcv / 10) % 10) - 1;
    val = rcv % 10;
    os << row << " " << col << " " << val << endl;
    g.set (row, col, val);
    count++;
}

if(!std::cin) {  // 3
  std::cin.clear();
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}