在C语言中打印数组元素,但只打印在其他输出之间的元素。

3
我将尝试将数独求解程序的结果打印到终端上,如下所示:
  +-------+-------+-------+
  | 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 | 谢谢。


考虑使用循环而不是手动操作,怎么样? - ameyCU
这是一个多维数组吗?你觉得哪一部分对你来说比较困难? - Jason Hu
通过阅读评估顺序,我可以告诉你正在使用 gcc。为什么你说你不能使用循环?再想一想,那不是真的。 - Jason Hu
这是一个一维数组。我不知道如何使用循环,因为我要打印三个数字,然后是 | 字符。还有 +-----+-----+ 这些线条。我可以使用硬编码的数字打印上面的图像,但我不知道如何将我的数组中的数字放在那里。 - Milda
1
printf("| %c %c %c | %c %c %c | %c %c %c |\n", test[i],test[i+1],test[i+2],test[i+3],test[i+4],test[i+5],test[i+6],test[i+7],test[i+8]); i+=9; 替换这种类型的行: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++]); - user3629249
4个回答

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();
}

谢谢,这正是我要找的。我尝试过类似的方法,但无法正确递增,并且当我成功后,它似乎太复杂了,所以我只是尝试了非循环版本。这是否意味着在C中没有更简单的方法来执行此操作?例如,printf("%c %c %c", 要打印的元素数组)? - Milda
@Milda,你无法自动地将数组扩展为函数参数列表。但你当然可以逐个传递每个元素:printf("%c %c %c", array[i], array[i + 1], array[i + 2]); - melpomene
这基本上就是我问这个问题的原因。我修复了我的嵌套循环版本(在一个循环中忘记添加j),现在它完美地工作了。谢谢。 - Milda

1

Q. 有没有更好的方法来做这件事?
A. 尝试使用 循环 来达到相同的效果。

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


4
不仅是结果未知,对同一变量进行两次修改(中间没有序列点)会导致未定义行为。 - melpomene

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

谢谢,这就是我最终得到的结果。我只是在寻找类似于printf("%c %c %c", 要打印的元素数组)这样的东西,这样我就不必使用嵌套循环,因为对我来说它似乎太复杂了(因此是错误的)。 - Milda

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接