优化/减少For循环

时间:2011-08-18 09:50:39

标签: c optimization for-loop

我正在学习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数组。提前谢谢!:)

4 个答案:

答案 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提到的任何功能。除了他的原始代码是正确还是不正确之外,没有提出任何其他的建议?