【发布时间】:2015-04-09 15:29:14
【问题描述】:
我有两个 char 数组 - 字符网格 [9] [9] - char possible_values [9] [9] [10]
网格数组是一个 9x9 数独,其中的空白处用“0”填充。 possible_values 数组是一个 9x9 数组,其中每个空格都填充了数独“123456789”可能的数字。
现在我想循环遍历网格数组 & 在每个已经有特定数字 (123456789) 的空间中我想清除特定空间的 possible_value 数组空间。
int j, k;
char empty_string [] = "";
char possible_values[9][9][10];
char grid [9][9];
for(j=0; j<9; j++){
for(k=0; k<9; k++){
printf("%d %d = %c -> pv = %s", j, k, grid[j][k], possible_values[j][k]);
if (grid[j][k] < 0 ){
memcpy(possible_values[j][k], empty_string, 10);
}
printf("%d %d = %c -> pv = %s", j, k, grid[j][k], possible_values[j][k]);
}
}
我已经用两个外购方法填充了这两个数组。
现在如果我运行程序, possible_values 的值保持不变,不会被空字符串覆盖。
我已经尝试将数组空间设置为 NULL
有人可以帮助我吗?而且我认为覆盖 possible_value 字符串是“清除”字符串的一种相当奇怪的方法,但我没有找到完全清除数组特定空间的方法?
编辑:
这是整个代码
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
/*****************************************************************************************************/
void sudoku_read(char sudoku[9][9]){
int j, k;
char filename[100];
printf("Please enter file name: ");
scanf("%s", filename);
FILE *file1 = fopen(filename, "r");
for(j=0;j<9;j++){
for(k=0;k<9;k++){
fscanf(file1,"%c\t", &sudoku[j][k]);
}
}
fclose(file1);
}
/*****************************************************************************************************/
void set_possible_values(char possible_values[9][9][10]){
int j, k;
char string [] = "123456789";
for(j=0;j<9;j++){
for(k=0;k<9;k++)
{
memcpy(possible_values[j][k], string, 10);
}
}
}
/*****************************************************************************************************/
void sudoku_solve(char grid[9][9]) {
int j, k, i;
char empty_string [] = "";
char possible_values[9][9][10];
set_possible_values(possible_values);
for(j=0; j<9; j++){
for(k=0; k<9; k++){
printf("%d %d = %c -> pv = %s", j, k, grid[j][k], possible_values[j][k]);
warten();
if (grid[j][k] < 0 ){
memset(possible_values[j][k], 0, 10);
}
printf("%d %d = %c -> pv = %s", j, k, grid[j][k], possible_values[j][k]);
warten ();
}
}
for(j=0; j<9; j++){
for(k=0; k<9; k++){
if(grid[j][j] != 0){
printf("grid[%d][%d] = %c", j, k, grid[j][k]);
printf("\tThe possible values of cell [%d][%d] are [%s]\n", j, k, possible_values[j][k]);
}
}
}
}
/*****************************************************************************************************/
int main(void) {
int n;
int i;
int j;
int k;
char board[9][9];
printf("How many Sudokus shoul be solved: ");
scanf("%d",&n);
for(i=0;i<n;i++) {
sudoku_read(board);
sudoku_solve(board);
}
return 0;
}
【问题讨论】:
-
empty_string是你的问题。 -
我想你想用
memset而不是memcpy:memset documentation -
哦...那里还有很多其他错误的东西!!!
grid数组未初始化,因此它包含“垃圾”数据。您希望通过打印它来实现什么(更不用说,通过在if语句中检查它)???此外,它是一个char数组,您将其值打印为整数 (%d)。你确定这确实是你的意图吗? -
我最初将此作为答案发布,但您的代码包含其他几个错误(正如我在上面的评论中提到的),所以我将其删除。这是最严重的错误...
empty_string数组的大小是单个字符(设置为 0)。所以memcpy(possible_values[j][k], empty_string, 10)会产生未定义的行为。如果你想用 10 个零填充possible_values[j][k],那么你可以简单地调用memset(possible_values[j][k], 0, 10)。但是如果你只是想将它设置为一个空的以null结尾的字符串,那么你不妨调用possible_values[j][k][0] = 0。 -
字符串操作,例如
strcpy、strcat、strlen和printf与"%s"将不会引用除第一个字符(现在设置为0)之外的任何其他值, 所以possible_values[j][k]本质上会变成一个空字符串。