【问题标题】:Typecasting int to char, then search array将 int 类型转换为 char,然后搜索数组
【发布时间】:2015-08-31 20:19:52
【问题描述】:

我在 C 中的类型转换有问题。

让我先解释一下我的问题:我有一个二维整数数组,其中填充了 0-9 的数字(它是一个数独,0 表示一个空格)。

然后我有第二个数组,它是一个 3 维字符数组。它包含我的数独空格的所有可能值作为字符串“123456789”。现在,在我填充了两个数组(确实有效)之后,我想在我的 int 数组上循环 2 个 for 循环,并找到所有已经存在 1-9 值的地方。我将该值保存在一个临时变量中。

然后我想遍历 char 数组并从连接到我在 int 数组中找到值的位置的所有行和行中删除临时变量的值(就像真正的数独一样,每个数字只能每行和每行出现一次)。

好吧,要搜索一个 char 数组,我需要一个 char。但是临时变量是一个int,所以我必须对它进行类型转换,这就是问题所在。

for(j=0; j<9; j++){
    for(k=0; k<9; k++){
        if (grid[j][k] != 0){

            help_variable_remove_pv = grid[j][k];

            cast_number/*char*/ = (char) help_variable_remove_pv/*int*/;

            printf("%c", cast_number); 
            printf("\n%d", cast_number); 

        }
    }
}

我将 int 转换为 char。但是当它显示在控制台上进行测试时。当我将它打印为字符时,我得到一个“笑脸”,但当我打印为整数时它显示实际数字。但我需要char而不是int中的实际数字。

void sudoku_read(int 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,"%d\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(int grid[9][9])

 int j, k, a, b, i;
 int help_variable_remove_pv;
 char cast_number;

 char possible_values[9][9][10];
 char zero_string [] = "000000000";

 set_possible_values(possible_values);



for(j=0; j<9; j++){
    for(k=0; k<9; k++){
        if (grid[j][k] > 0){

            memcpy(possible_values[j][k], zero_string, 10);

        }   
    }
}    


for(j=0; j<9; j++){
    for(k=0; k<9; k++){
        if (grid[j][k] != 0){

            help_variable_remove_pv = grid[j][k];

            cast_number/*char*/ = (char) help_variable_remove_pv/*int*/;

            printf("%c", cast_number); /*Gives out a smiley*/
            printf("\n%d", cast_number);  /*Gives out the number*/




        }
    }
}



int main(int argc, char *argv[]) 

int n, j, k, i;

int board [9][9];

printf("How many Sudokus should be solved: ");
scanf("%d", &n);

for(i=0; i<n; i++){
    sudoku_read(board);
    sudoku_solve(board);
}

return 0;

【问题讨论】:

  • 所以如果我正确理解了这个问题,实际的问题是“如何将整数转换为字符?”

标签: c arrays string casting int


【解决方案1】:

使用

cast_number/*char*/ = (char) help_variable_remove_pv + '0'/*int*/;

而不是

cast_number/*char*/ = (char) help_variable_remove_pv/*int*/;

字符和整数有些不同。这意味着 '0'(character 0) 和整数 0 不相等。您必须将 48('0' 的 ASCII 值)添加到 0 才能获得 '0' 的整数值。有关字符及其等效整数的更多信息,请参阅The ASCII table

请注意,48 和'0' 是相同的整数

【讨论】:

  • 解释'0' 代表字符的整数值可能是个好主意,并且将 ASCII 排除在您的解释之外......这样人们就不会认为 ASCII 是一个要求,尽管它在当今时代(可能还有未来)是多么普遍,并且当他们使用其他东西(例如 EBCDIC)时会得到一个很大的惊喜。
【解决方案2】:

char 变量基本上就像任何其他整数变量一样,但其值是字符的编码。对于常见的ASCII 编码字符'A' 具有十进制值65。因此,如果将'A' 作为字符打印,则会得到A,但如果将其打印为整数,则会得到值65 .

如果您查看链接表,您会看到数字的值是4857,都是连续的,这意味着您可以将'0' 添加到任何十进制数字以获取其 ASCII 值,即字符。所以'0' + 5 将产生值53,当打印为字符时为'5'

【讨论】:

  • 为了完整起见,可能值得指出的是,C 需要十进制数字的编码属性。 '0' + 3 始终是 '3'。不保证字母表中的字母,仅适用于数字。
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多