【问题标题】:2d array and for loops二维数组和for循环
【发布时间】:2020-04-03 14:58:10
【问题描述】:

我做了这段代码来尝试二维数组(二维数组)的基本操作,但它不打印 屏幕上的字母“A”。 有人可以帮我解决这个问题吗? 谢谢

#include <stdio.h>

#define ROWS  2
#define COLS  3

int main()
{
    int x; 
    int y; 
    int i; 
    int j;
    int Field[ROWS][COLS];

    printf("Enter two values: ");
    scanf("%d %d", &x, &y);
    Field[y][x] = 1;

    for(i = ROWS - 1; i > 0; i--){
        for(j = 0; j < COLS; j++){
            if(Field[i][j] == 1){
            printf("A");
            }
        }
    }
    return 0;

}

【问题讨论】:

  • i &gt; 0 应该是 i &gt;= 0。还有什么输入?
  • 这段代码有很多问题。您能否详细描述一下您正在尝试做的事情,以便我们可以提供帮助?
  • 输入是什么?你正在为这个项目捐款
  • @hanie - scanf 用于获取输入。
  • @ryyker 我知道,我认为除了i&gt;0 应该是i&gt;=0 之外,不打印"A" 的问题来自于超出数组边界的输入。

标签: c arrays loops for-loop


【解决方案1】:

在外循环中

for(i = ROWS - 1; i > 0; i--){

索引的范围是(从小到大)[ROWS-1, 1],所以这个循环不处理索引0。

这样的循环最好这样写

for ( i = ROWS; i != 0; i-- ){
    for(j = 0; j < COLS; j++){
        if(Field[i-1][j] == 1){
        printf("A");
        }
    }
}

在这种情况下,变量i 甚至可以是无符号整数类型,例如size_t,即使ROWS 等于0,代码也将有效。 否则,当 ROWS 等于 0 时,表达式 ROWS - 1 可以产生无符号类型的最大值。

【讨论】:

    【解决方案2】:

    正如提到的i&gt;0 应该是i&gt;=0 否则你不会完全遍历数组。

    还请注意,即使您更正了该语句,最好检查输入 xy ,因为如果它们大于或等于 ROWSCOLS ,而不是通过数组的边界这里Field[y][x] = 1; 你的程序会导致未定义的行为。

    所以我建议这个

        scanf("%d %d", &x, &y);
        if (x < ROWS && y < COLS)
        Field[y][x] = 1;
        else
        return 0;
    //rest of your code with i>=0 in this loop for(i = ROWS - 1; i >= 0; i--)
    

    【讨论】:

      【解决方案3】:

      这:for(i = ROWS - 1; i &gt; 0; i--){ 无法遍历必要的数组位置,并且没有向您的软件的未来维护者清楚地传达究竟是什么意图。

      但是,要执行您在问题描述中描述的操作,除非有令人信服的理由来设置递减索引 (--),正常递增 (++) 的 for 循环集就足够了,而且更多惯用语:)

      for(i = 0; i < ROWS; i++)
      {
          for(j = 0; j < COLS; j++)
          {
              if(Field[i][j] == 1)
              {
                  printf("A");
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        此代码为越界数组添加了一些保护并打印“A”。对你来说应该是一个很好的起点。

        #include <stdio.h>
        
        #define ROWS  2
        #define COLS  3
        int main()
        {
            int x,y,i,j = 0;
            int Field[ROWS][COLS]; // 2 Rows 3 Column array
        
            printf("\nEnter row value less than %i: ",ROWS); 
            scanf("%d", &y);
        
            printf("\nEnter column value less than %i: ",COLS); 
            scanf("%d", &x);
        
            if(x >= COLS || y>= ROWS)
            {
                printf("\nOut of bounds inputs!");
                return 0;
            }
        
            Field[y][x] = 1;
        
            for(i = ROWS - 1; i > 0; i--)
            {
                for(j = 0; j < COLS; j++)
                {
                    if(Field[i][j] == 1)
                    {
                        printf("A");
                    }
                }
            }
            return 0;
        }
        

        【讨论】:

        • 我也会像其他用户提到的那样更正您的循环。其他两个答案在该类别中都有很大改进。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        相关资源
        最近更新 更多