c - 在c中将值写入二维数组

标签 c arrays

作为 C 和这个网站的新手,我不熟悉我遇到的这个问题。我有一个包含 [8][8] 元素的二维数组。我试图让用户在数组中输入数字直到完成。该程序还远没有完成,但在继续之前我就陷入了这个问题。基本上我使用 for 循环让用户输入每个元素。但是,当第一行完成时,它将最后一个值覆盖到第一列第二行元素点上。我怎样才能防止这种情况发生:这是我的代码:

#include <stdio.h>
#include <string.h>

int Check_rules();

void Print_Array(int array[][8], int size)
{
  int i, j;
  for (i = 0; i <= size; i++)
  {
    printf("\n");
    for (j = 0; j <= size; j++)
    {
      printf("%d ",array[i][j]);
    }
  } 
  printf("\n\n");
}

int main()
{
  int size = 8;
  int i, j;


  int fullArray[size][size];
  int grid1[3][3];
  int grid2[3][3];
  int grid3[3][3];
  int grid4[3][3];
  int grid5[3][3];
  int grid6[3][3];
  int grid7[3][3];
  int grid8[3][3];
  int grid9[3][3]; 

  for (i = 0; i <= size; i++)
  {
    for (j = 0; j <= size; j++)
      fullArray[i][j] = 0;

  } 

  printf("Want to play a game? Enter values 1-9 starting in row 1 column 1, \nand we will work our way from there. Here's the playing board.\nIt's Sudoku, so follow the rules of the game.\n\n");

  for (i = 0; i <= size; i++)
  {
    printf("\n");
    for (j = 0; j <= size; j++)
      printf("%d ",fullArray[i][j]);

  } 
  printf("\n\n");

  int tmp;
  char *keeper = (" ");//space for marker

  for (i = 0; i <= size; i++)
  {

    for (j = 0; j <= size; j++)
    {
      printf("Enter first value(press 0 and ENTER to skip a box, \nand -1 to cancel    game): ");

      scanf("%d", &tmp);
      if(tmp == -1)
        return 0;

      fullArray[i][j] = tmp;
      Print_Array(fullArray,size);
    }

  }

  return 0;
}

如果您运行此命令,当您在第 1 行中输入最后一个值时,您会看到我的问题。它会覆盖第二行第一列元素点吗?

最佳答案

无论你在哪里<= size ,你实际上想要 < size 。这是因为 C 使用基于 0 的索引。这意味着如果您有一个包含 5 个元素的数组,则索引为 0、1、2、3、4。在像 for (int i = 0; i <= 5; i++) 这样的循环中, i将得到值 0、1、2、3、4、5。最后一个是数组的无效索引。使用i < 5修复了问题(确保 i 在达到 5 之前停止)。

修复并清理了代码版本:

#include <stdio.h>
#include <string.h>

void printArray(int size, int array[][size]) {
    for (int i = 0; i < size; i++) {
        printf("\n");
        for (int j = 0; j < size; j++) {
            printf("%d ", array[i][j]);
        }
    } 
    printf("\n\n");
}

int main() {
    int size = 8;
    int fullArray[size][size];

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            fullArray[i][j] = 0;
        }
    } 

    printf("Enter values in row 1 column 1, and we will work our way from there. Here's the playing board. \n\n");

    printArray(size, fullArray);

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("Enter first value (press 0 and ENTER to skip a box, or -1 to cancel game): ");

            int number;
            scanf("%d", &number);
            if(number == -1) {
                return 0;
            }

            fullArray[i][j] = number;
            printArray(size, fullArray);
        }
    }

    return 0;
}

编辑

澄清一下,这是问题中原始代码的固定版本。新代码有点不同,但我认为问题是相同的。

关于c - 在c中将值写入二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260168/

相关文章:

java - 如何获得可以为正值也可以为负值的随机值?

java - 如何为字符串数组中的每个元素添加一个字符串前缀?

arrays - 在函数定义和变量赋值中使用 "hash"

在包含中使用 ssl 进行编译

c - 二维数组内存分配出错时如何正确释放

c++ - C/C++ 中的分布式键/值存储,具有可插拔存储

javascript - 识别整数数组中最长的方差周期

c++ - 将字符串列表转换为 C 样式数组

检查字符串 A 的数组是否包含字符串 B 的数组中存在的字母(不起作用)

c - 阻止 gcc 覆盖目标文件