在C中的其他输出之间打印数组元素

在C中的其他输出之间打印数组元素,c,arrays,printf,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 |
  +-------+-------+-------+
  | 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|

谢谢。

Q.有更好的方法吗?
A.尝试使用以达到相同的效果


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

这里有一种方法可以将其分解为(嵌套)循环:

无效打印数据行(常量字符*p){
printf(“|”);
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
printf(“%c”,p[i*3+j]);
}
printf(“|”);
}
printf(“\n”);
}
作废打印分隔符(作废){
printf(“+----+----+----+\n”);
}
...
打印分隔符();
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
打印数据行(&board[(i*3+j)*9]);
}
打印分隔符();
}
没有循环?好啊 我倾向于说,与单个或嵌套循环相比,这甚至是一个更好的解决方案。可以看出它在做它应该做的事情

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");
试试这个:

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);
}
for(int i=0;i<13;i++){//13,因为9个数字+4个分隔符
对于(int j=0;i<13;i++){
如果((i%4==0)和&(j%4==0)){
printf(“+”;//分隔符交叉
}else if(i%4==0){
printf(“-”;//垂直分隔符
}否则如果(j%4==0){
printf(“|”);//水平分隔符
}否则{
printf(“%d”,数独[row(i)][row(j)];//数独是2d结果数组
}
printf(“\n”);//行尾
}
int行(j){//不带计数分隔符的行(或列)
int nofsepator=(i-(i%4))/4;
返回(13-无分离器);
}

考虑使用循环而不是手动操作怎么样?这是一个多维数组吗?你觉得哪部分对你来说比较困难?我可以通过阅读评估顺序来告诉你正在使用
gcc
。为什么你说你不能使用循环?三思。那不是真的。这是一维数组。我不知道如何使用循环我打印了三个数字,然后是|字符。还有+-----+------+行。我可以用硬编码的数字打印上面的图片,但我不知道如何从数组中输入数字。替换这种行:
printf(|%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++],test[i++],test[i++];
使用
printf(“|%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]);这不仅仅是一个未知的结果。修改同一个变量两次(中间没有一个序列点)有未定义的行为。谢谢,这正是我想要的。我尝试了类似的方法,但无法正确地进行增量,当我这样做时,它似乎太复杂了,所以我只尝试了非循环版本。这是否意味着在C中没有更简单的方法来实现这一点?类似于printf(“C%C%C”,要打印的元素数组);?@Milda您无法自动将数组“展开”为函数参数列表。当然,您可以分别传递每个元素:
printf(“%c%c%c”)、数组[i]、数组[i+1]、数组[i+2]);
这就是我问这个问题的基本原因。我修复了嵌套循环版本(忘记在一个循环中添加j)现在它工作得很好。谢谢汉克斯,这是我最后得到的东西。我只是在寻找像printf(“c%c%c”,要打印的元素数组)这样的东西,这样我就不必使用嵌套循环,因为它对我来说太复杂了(因此是错误的)。
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);
}