如何将int与char进行比较?

时间:2013-11-15 05:01:18

标签: c++ integer comparison character

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

5 个答案:

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

答案 1 :(得分:3)

从字符中减去48将为您提供相当于它的数字。 例如假设你有 char num ='0'; 要将此字符'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;
}

答案 2 :(得分:0)

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

但是,如果numint,那么:

fin >> num;

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

答案 3 :(得分: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代码。看an ascii table我们可以看到'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。

答案 4 :(得分:0)

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

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

fin类似。