【问题标题】:Optimizing/Reducing For-loops优化/减少 For 循环
【发布时间】:2011-10-29 15:34:08
【问题描述】:

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

【问题讨论】:

  • ...您的循环似乎将 input2 的所有单元格设置为 input[8]。

标签: c optimization for-loop


【解决方案1】:

您的代码没有按照您的预期执行。

听起来你想要这样的东西:

for (row = 0; row < 9; ++row) {
    for (col = 0; col < 9; ++col) {
        input2[row][col] = input[(row * 9) + col];
    }
}

编辑:顺便说一句,当让用户输入一个字符串时,请确保缓冲区中有足够的空间来容纳整个字符串,加上终止的'\0' 字符!您的input 缓冲区需要至少有82 个char 的空间。

【讨论】:

  • 为什么使用 ++row 和 ++col 而不是使用 row++ 和 col++?谢谢
  • @Trixie :使用 C++ 的习惯力量。前缀增量可以更有效,因为它避免了复制操作。对于像int 这样的内在类型,无论哪种方式都无关紧要,但是尽可能使用前缀增量是一个好主意(只是为了在那些确实重要的情况下习惯它)。更多细节可以在C++ FAQ Lite 13.15中找到
  • @Trixie :因为每一行有9个项目,所以要跳过一行,需要跳过9个项目(二维数组存储在row major order中)。
  • 我在上一条评论中提到的 wiki 文章非常清楚地解释了这一点。通读一遍。
【解决方案2】:

由于您希望允许用户输入 81 数字(作为字符),因此保存它们的 char 数组的大小必须为 82 或更大。

char input[82];

你的 scanf 也不应该有 &amp;:

scanf("%s",input);

由于您想将用户输入的一维数组转换为二维数组,您可以这样做:

for (row=0;row<9;row++) {
   for (col=0;col<9;col++) 
      input2[row][col] = input[row*9+col];

【讨论】:

    【解决方案3】:

    作为下面的第一步,代码应该可以工作 -

    int i,j;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9;j++)
        {
            input2[i][j]=input[i];
    
        }
    }
    

    编辑:我已经给出了使 for 循环“更具可读性”的解决方案,以执行 OP 提到的任何功能。除了他的原始代码是对还是错之外没有其他建议吗?

    【讨论】:

      【解决方案4】:

      您想要的是根据81 的输入数填写9 * 9 矩阵。如前所述,您需要为终止'\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]);
                }
             }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多