如何比较 int 和字符

How to compare int with char?

本文关键字:int 字符 比较 何比较      更新时间:2023-10-16

好吧,基本上,我有一个包含 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。

使用

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

从字符中减去 48 将得到它的数字等效值。例如,假设你有
字符数 = '0';要将此字符"0"转换为数字 0
,您可以使用整数 num1= 数字 - 48;
您可以只定义类型为"char"的变量"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;
}

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

但是,如果numint,则:

fin >> num;

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

你说文件看起来像这样:

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', '_' };

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

此数组包含什么?

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

因此,如果打印为 ASCII 字符,则行 [0] 将显示"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。

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

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

fin是相似的。