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