好吧,基本上,我有一个包含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。
答案 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
会告诉你的,但我可能错了。
但是,如果num
是int
,那么:
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;
}
您的文件似乎已包含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
类似。