1

好的,基本上,我有一个包含 9x9 网格(数独谜题)的文件。现在这个数独谜题只完成了一部分,空格被替换为“_”(下划线)。所以这是文件的外观。

5 _ _ _ _ _ 1 7 _ 
1 _ 6 5 _ 9 _ 4 _ 
4 7 2 1 _ 6 _ _ _ 
9 _ _ _ _ _ 5 _ _ 
_ 1 8 _ 9 5 4 _ _ 
6 _ _ 4 _ 2 3 8 9 
_ 4 _ _ _ _ 9 3 _ 
_ 9 _ 7 _ 3 _ 5 _ 
2 6 3 9 5 8 7 1 4 

这是我的代码:

for(int row=0;row<9;row++)
{
    for(int column=0;column<9;column++)
    {
        fin >> num;
        if(num == '\95')
            sudokuPuzzle[row][column] = 0;
        else
            sudokuPuzzle[row][column] = num;
        cout << sudokuPuzzle[row][column] << " ";
    }
    cout << endl;
}

我遇到的问题是在这条线上:

if(num == '\95')

我在 ASCII 表中查找下划线的十进制值,这就是我发现的。但是,每当我的循环中的 cout 语句执行时,它显示我的数组只填充了文件中的第一个数字 5。如何在整数和字符之间进行适当的比较?

仅供参考:基本上我正在尝试做的是将所有下划线替换为 0。

4

5 回答 5

3

从字符中减去 48 将为您提供等效的数字。例如假设如果你有
char num = '0'; 要将这个 char '0' 转换为数字 0,您可以使用
int num1= num - 48;
您可以只定义 'char' 类型的变量 'num' 并使用以下
sudokuPuzzle[row][column] = num - 48;

char num;

for(int row=0;row<9;row++)
{
   for(int column=0;column<9;
   {
     fin >> num;
     if(num == '_')
        sudokuPuzzle[row][column] = 0;
     else
        sudokuPuzzle[row][column] = num - 48;
     cout << sudokuPuzzle[row][column] << " ";
}
cout << endl;
}
于 2013-11-15T06:17:46.817 回答
3

利用

if (num=='_')

真的就是这么简单。

但我认为问题出在代码的另一部分——当你阅读

fin >> num;

从下划线到 int 的转换不会令人满意:您需要将内容读入中间字符串变量:

fin >> myStringVariable;

然后看这个字符是数字还是下划线,并对其进行操作。

编辑完整程序:

#include <iostream>
#include <fstream>

int main(void)
{
  std::ifstream fin ("sudoku.txt");
  std::string line;
  int pos;
  int sudokuPuzzle[9][9];
  for(int row=0;row<9;row++)
  {
    getline(fin, line);
    std::cout << "as read in:         " << line << std::endl;
    while((pos = line.find("_", 0))!=std::string::npos)
    {
      line[pos] = '0';
    }
    // show that it worked:
    std::cout << "after substitution: " << line << std::endl;

    // make a copy of line to process with strtok:
    char *dup = strdup(line.c_str());

    // and now numerically:
    sudokuPuzzle[row][0] = atoi(strtok(dup, " "));
    std::cout << "after conversion:   " << sudokuPuzzle[row][0] << " ";

    for(int column=1;column<9;column++)
    {
      sudokuPuzzle[row][column] = atoi(strtok(NULL, " "));
      std::cout << sudokuPuzzle[row][column] << " ";
    }
    std::cout << std::endl;
    std::cout << std::endl;
    free(dup);
  }
}

产生以下输出。我认为这是不言自明的。

as read in:         5 _ _ _ _ _ 1 7 _ 
after substitution: 5 0 0 0 0 0 1 7 0 
after conversion:   5 0 0 0 0 0 1 7 0 

as read in:         1 _ 6 5 _ 9 _ 4 _ 
after substitution: 1 0 6 5 0 9 0 4 0 
after conversion:   1 0 6 5 0 9 0 4 0 

as read in:         4 7 2 1 _ 6 _ _ _ 
after substitution: 4 7 2 1 0 6 0 0 0 
after conversion:   4 7 2 1 0 6 0 0 0 

as read in:         9 _ _ _ _ _ 5 _ _ 
after substitution: 9 0 0 0 0 0 5 0 0 
after conversion:   9 0 0 0 0 0 5 0 0 

as read in:         _ 1 8 _ 9 5 4 _ _ 
after substitution: 0 1 8 0 9 5 4 0 0 
after conversion:   0 1 8 0 9 5 4 0 0 

as read in:         6 _ _ 4 _ 2 3 8 9 
after substitution: 6 0 0 4 0 2 3 8 9 
after conversion:   6 0 0 4 0 2 3 8 9 

as read in:         _ 4 _ _ _ _ 9 3 _ 
after substitution: 0 4 0 0 0 0 9 3 0 
after conversion:   0 4 0 0 0 0 9 3 0 

as read in:         _ 9 _ 7 _ 3 _ 5 _ 
after substitution: 0 9 0 7 0 3 0 5 0 
after conversion:   0 9 0 7 0 3 0 5 0 

as read in:         2 6 3 9 5 8 7 1 4 
after substitution: 2 6 3 9 5 8 7 1 4 
after conversion:   2 6 3 9 5 8 7 1 4 

奖金

5 3 9 8 2 4 1 7 6
1 8 6 5 7 9 2 4 3
4 7 2 1 3 6 8 9 5
9 2 4 3 8 7 5 6 1
3 1 8 6 9 5 4 2 7
6 5 7 4 1 2 3 8 9
7 4 5 2 6 1 9 3 8
8 9 1 7 4 3 6 5 2
2 6 3 9 5 8 7 1 4
于 2013-11-15T05:03:34.053 回答
0

你说文件看起来像这样:

5 _ _ _ _ _ 1 7 _ 
1 _ 6 5 _ 9 _ 4 _ 
4 7 2 1 _ 6 _ _ _ 
9 _ _ _ _ _ 5 _ _ 
_ 1 8 _ 9 5 4 _ _ 
6 _ _ 4 _ 2 3 8 9 
_ 4 _ _ _ _ 9 3 _ 
_ 9 _ 7 _ 3 _ 5 _ 
2 6 3 9 5 8 7 1 4 

这意味着文件的第一行可以表示如下:

char line[] = { '5', '_', '_', '_', '_', '_', '1', '7', '_' };

虽然这是一个 char 数组,但它不是字符串,因为我没有添加尾随的 nul。

这个数组包含什么?

第一个字符,line[0]代表 ASCII 字符 '5'。这与整数值不同5,它是'5'的 ASCII 码。查看ascii 表,我们可以看到 '5' 是 ASCII 字符 53。

因此,line[0] 如果打印为 ASCII 字符,将显示 '5',但如果打印为整数值,将显示 '53'。

#include <iostream>

int main() {
    char fourtyTwoPlus11 = 53;
    std::cout << fourtyTwoPlus11 << "\n";
    std::cout << static_cast<int>(fourtyTwoPlus11) << "\n";
    return 0;
}

现场演示:http: //ideone.com/JEUcLO

您的文件似乎已经包含 ASCII 字符而不是整数值。因此,对于每个字符,您实际上都需要转换为数值。您可以执行以下操作:

enum { NumColumns = 9, UnknownValue = -1 };

char line[NumColumns] = { '5', '_', '_', '_', '_', '_', '1', '7', '_' };
int values[NumColumns];

for (size_t i = 0; i < NumColumns; ++i) {
    char col = line[i];
    if (col == '_')
        values[i] = UnknownValue;
    else
        values[i] = col - '0';
}

整数值在 0-9 范围内,这是我们利用 ASCII 表以 0、1、2 ... 9 的顺序存储数字的知识而获得的。所以 '0' - '0' == 0 和 ' 9' - '0' = 9。

我选择使用 -1 来表示未知值,但您也可以在这里轻松地使用 0。

于 2013-11-15T05:40:44.380 回答
0

对于这种情况(获取 char 或 int 的输入),我通常使用这个技巧:

char c;
int n;
cin >> c;
if(c != '_'){
    cin.putback(c);
    cin >> n;
}

fin很相似。

于 2013-11-15T05:53:30.060 回答
0

\nnn中, nnn 是八进制的。9不是八进制数字。我很肯定-Wall会告诉你,但我可能是错的。

但是,如果numint,则:

fin >> num;

不太可能做你想做的事,因为_它不是整数。我认为fin在这种情况下,流输入运算符会设置错误位。

于 2013-11-15T05:07:50.563 回答