在C

时间:2015-08-29 14:48:25

标签: c arrays printf

我正在尝试将我的数独求解程序的结果打印到终端中,如下所示:

  +-------+-------+-------+
  | 1 2 3 | 4 5 6 | 7 8 9 |
  | 1 2 3 | 4 5 6 | 7 8 9 |
  | 1 2 3 | 4 5 6 | 7 8 9 |
  +-------+-------+-------+
  | 1 2 3 | 4 5 6 | 7 8 9 |
  | 1 2 3 | 4 5 6 | 7 8 9 |
  | 1 2 3 | 4 5 6 | 7 8 9 |
  +-------+-------+-------+
  | 1 2 3 | 4 5 6 | 7 8 9 |
  | 1 2 3 | 4 5 6 | 7 8 9 |
  | 1 2 3 | 4 5 6 | 7 8 9 |
  +-------+-------+-------+

我将我的解决方案存储在一维数组中,但我找不到打印它的方法。这是我到目前为止所提出的:

printf("| %c %c %c | %c %c %c | %c %c %c |\n", test[0],test[1],test[2],test[3],test[4],test[5],test[6],test[7],test[8]);

我不能使用任何周期,因为我需要绘制"墙壁"数字周围。有没有更好的方法呢?为什么

char test[] = {'1','2','3','4','5','6','7','8','9'};
int i = 0;
printf("| %c %c %c | %c %c %c | %c %c %c |\n",   test[i++],test[i++],test[i++],test[i++],test[i++],test[i++],test[i++],test[i++],test[i++]);

返回| 9 8 7 | 6 5 4 | 3 2 1 | 感谢。

4 个答案:

答案 0 :(得分:5)

这是将其分解为(嵌套)循环的一种方法:

void print_data_row(const char *p) {
    printf("|");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf(" %c", p[i*3 + j]);
        }
        printf(" |");
    }
    printf("\n");
}

void print_separator(void) {
    printf("+-------+-------+-------+\n");
}

...
print_separator();
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        print_data_row(&board[(i*3 + j) * 9]);
    }
    print_separator();
}

答案 1 :(得分:1)

Q值。有没有更好的方法呢? A.尝试使用loops来实现相同目标。

对于你的第二个问题,答案是函数参数的评估顺序在C中是不确定的。因此,你永远不知道,这9个test[i++]中的哪一个首先被评估。因此,未知结果(实际上是未定义的行为)。更多here

答案 2 :(得分:1)

没有循环?好。 与单个或嵌套循环相比,我倾向于说这甚至是卓越的解决方案。它可以来做它应该做的事情。

char *t = test;
printf("+-------+-------+-------+\n");
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("+-------+-------+-------+\n");
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("+-------+-------+-------+\n");
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
t += 9;
printf("| %c %c %c | %c %c %c | %c %c %c |\n", t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]);
printf("+-------+-------+-------+\n");

答案 3 :(得分:1)

试试这个:

for(int i = 0; i < 13; i++){ // 13 because 9 numbers + 4 separators
  for(int j = 0; i < 13; i++){
    if((i % 4 == 0) && (j % 4 == 0)){
      printf("+"); // separator crossing
    } else if (i % 4 == 0){
      printf("-"); // vertical separator
    } else if (j % 4 == 0){
      printf("|"); // horizontal separator
    } else {
      printf("%d",sudoku[row(i)][row(j)]); // sudoku is the 2d result array
    }
  printf("\n"); // end of line
}

int row(j){ // row (or column) without counting separators
  int nOfSeparator = (i - (i % 4))/4;
  return (13 - nOfSeparator);
}