我正在学习C,我想知道如何减少for循环,使其更具代表性。
#include<stdio.h>
int main() {
char input[81];
int i;
char input2[9][9];
int col,row;
printf("Enter sudoku board:");
scanf("%s",&input);
for (i=0;i<9;i++) {
for (col=0;col<9;col++)
input2[0][col]=input[i];
for (col=0;col<9;col++)
input2[1][col]=input[i];
for (col=0;col<9;col++)
input2[2][col]=input[i];
for (col=0;col<9;col++)
input2[3][col]=input[i];
for (col=0;col<9;col++)
input2[4][col]=input[i];
for (col=0;col<9;col++)
input2[5][col]=input[i];
for (col=0;col<9;col++)
input2[6][col]=input[i];
for (col=0;col<9;col++)
input2[7][col]=input[i];
for (col=0;col<9;col++)
input2[8][col]=input[i];
}
这表明用户将在数组中输入81个数字,然后输入的数字将被传输到9x9数组。提前谢谢!:)
答案 0 :(得分:2)
您的代码没有按照您的预期执行。
听起来你想要的东西如下:
for (row = 0; row < 9; ++row) {
for (col = 0; col < 9; ++col) {
input2[row][col] = input[(row * 9) + col];
}
}
编辑:顺便说一下,当让用户输入字符串时,请确保缓冲区中有足够的空间来容纳整个字符串,以及终止'\0'
字符!您的input
缓冲区需要有至少82 char
的空间。
答案 1 :(得分:1)
由于您希望允许用户输入81
个数字(作为字符),因此要保留它们的char数组的大小必须为82
或更多。
char input[82];
此外,您的scanf不应包含&
:
scanf("%s",input);
由于您希望将用户输入的1D数组转换为2D数组,您可以执行以下操作:
for (row=0;row<9;row++) {
for (col=0;col<9;col++)
input2[row][col] = input[row*9+col];
答案 2 :(得分:0)
您想要的是根据9 * 9
输入数填写81
矩阵。如上所述,您需要为终止'\0'
再分配一个字符。这就是C风格阵列的名气。
int i = 0, row = 0, col = 0;
// set matrix row by row
for (row = 0; row < 9; row++)
{
// for each row, set from left to right
for (col = 0; col < 9; col++)
{
input2[row][col] = input[i++];
}
}
改进:您不必预先分配字符串来保存81
个字符。您可以选择直接设置为所需的结果数组。
int i = 0, row = 0, col = 0;
// set matrix row by row
for (row = 0; row < 9; row++)
{
// for each row, set from left to right
for (col = 0; col < 9; col++)
{
scanf("%c", &input2[row][col]);
}
}
答案 3 :(得分:0)
作为第一步,代码应该有效 -
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
input2[i][j]=input[i];
}
}
编辑:我已经给出了让for循环“更具可读性”的解决方案,以执行OP提到的任何功能。除了他的原始代码是正确还是不正确之外,没有提出任何其他的建议?