C:清除/覆盖数组中的特定空间

C:清除/覆盖数组中的特定空间,c,arrays,string,sudoku,C,Arrays,String,Sudoku,我有两个字符数组 -字符网格[9][9] -字符可能的_值[9][9][10] 网格数组是一个9x9数独游戏,其中的空格用“0”填充。 可能的_值数组是一个9x9数组,其中每个空格中都填充了数独“123456789”可能的数字 现在我想在网格数组上循环&在每个已经有一定数量(123456789)的空间中,我想清除特定空间中可能的_值数组空间 int j, k; char empty_string [] = ""; char possible_values[9][9][10

我有两个字符数组 -字符网格[9][9] -字符可能的_值[9][9][10]

网格数组是一个9x9数独游戏,其中的空格用“0”填充。 可能的_值数组是一个9x9数组,其中每个空格中都填充了数独“123456789”可能的数字

现在我想在网格数组上循环&在每个已经有一定数量(123456789)的空间中,我想清除特定空间中可能的_值数组空间

    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]);                   

        }
    }  
intj,k;
字符空_字符串[]=“”;
字符可能的_值[9][9][10];
字符网格[9][9];

对于(j=0;j您的空字符串只有1大(0x00值,表示字符串的结尾)。您将从该值之后复制一堆垃圾到要清除的位置。更好的选择是使用
memset(可能的值[j][k],0,10);
两个建议: 1.让您的字符缓冲区始终为空 2.执行strncpy而不是memcpy,最多9个字符,并将第10个字符保留为空,如下所示:

strncpy(possible_values[j][k], string, 10-1);
possible_values[j][k][10-1]='\0';

另外,在其他使用类似东西的地方,
空字符串是你的问题。我想你应该使用
memset
而不是
memcpy
:哦……还有很多其他错误的东西!!!网格
数组没有初始化,所以它包含“垃圾”数据。您希望通过打印它(更不用说在
if
语句中检查它)来实现什么?此外,它是一个
char
数组,您将其值打印为整数(
%d
)。您确定这确实是您的意图吗?我最初将此作为答案发布,但您的代码包含几个其他错误(如我在上面的评论中所述),因此我将其删除。这是最严重的错误…空字符串的大小是单个字符(设置为0)。因此
memcpy(可能的值[j][k] ,empty_string,10)
产生未定义的行为。如果您想用10个零填充
可能的_值[j][k]
,那么您只需调用
memset(可能的_值[j][k],0,10)
。但如果您只想将其设置为以空结尾的字符串,那么您还可以调用
可能的_值[j][k][0]=0
。字符串操作,例如
strcpy
strcat
strlen
printf
,使用
%s
将不会引用第一个字符(现在设置为0)之外的任何其他值,因此
可能的值[j][k]
基本上会变成一个空字符串。好的,它与memset方法一起工作,我可以覆盖内容。但在我的程序中,它不会覆盖任何仍然与以前一样的内容-我的If方法有问题吗?您是否已将网格数组初始化为任何内容?否则它将被垃圾填充。它当前会检查它是否低于零是的,所有网格都已初始化。您应该将所有相关代码添加到示例变量
grid
可能是
int
数组,而不是
char
数组(从
printf
调用和
if
语句中“处理”的方式判断)。