【问题标题】:C : Clearing/Overwritting specific space in ArrayC:清除/覆盖数组中的特定空间
【发布时间】: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
  • 字符串操作,例如strcpystrcatstrlenprintf"%s" 将不会引用除第一个字符(现在设置为0)之外的任何其他值, 所以possible_values[j][k] 本质上会变成一个空字符串。

标签: c arrays string sudoku


【解决方案1】:

您的空字符串只有 1 大(0x00 值,表示字符串的结尾)。您将从该值之后复制一堆垃圾到您要清除的地方。更好的选择是使用memset(possible_values[j][k], 0, 10);

【讨论】:

  • 好的,它适用于 memset 方法,我可以覆盖东西。但在我的程序中,它并没有覆盖任何与以前相同的东西——我的 If 方法有问题吗?
  • 您是否已将网格阵列初始化为任何内容?否则会被垃圾填满。它目前检查它是否低于零,您无法确保任何地方。
  • 是的,所有网格都已初始化。
  • 您应该将所有相关代码添加到您的示例中
  • 变量grid 可能意味着是一个int 数组,而不是char 数组(根据它在printf 调用和@987654326 中“处理”的方式来判断@ 声明)。
【解决方案2】:

两个建议: 1. 始终终止您的字符缓冲区空值 2. 执行 strncpy 而不是 memcpy 最多 9 个字符,并将第 10 个字符保留为 null,如下所示:

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

而且,在其他使用类似东西的地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多