繁体   English   中英

填充和打印2D阵列

[英]Filling and Printing a 2D array

所以我有一个2D数组,我以后想用。 现在,我只想填补空白。

到目前为止,我只是在弄乱数组类型和不同的默认值。 据我了解,一个新的数组填充有“ 0”,我也尝试过NULL。

int r = 5;
int c = 5;
int i;
int j;
int k = 0;
int area = r*c;

const char *array[r][c]; //tried char array[r][c] and other types

在这里设置我的初始值和数组。

while(k< area){
    for (j = 0; j < c; j++){
        for (i = 0; i<r; i++){
            if (array[i][j] == 0){
                board[i][j] = ".";
            }
            printf("%c",aray[i][j]); 
            if (i = r - 1){
                printf("\n");
            }
            k++;

        }
    }

}

在这里,我尝试用“。”替换所有未填充的值(此时所有值),因此输出应为5x5点的行。 相反,我得到了奇怪的字母和数字。 我已经尝试了%s的%c insead,虽然运气不好,但输出却有所不同。 我在哪里做,我得到一些点,但仍然不在网格上,并且出现了怪异的值。

我也很确定printf在for循环中,默认情况下会在新行上显示,这样我就不会得到网格,那么有没有更好的方法呢?

您拥有的是一个指针数组。 这将适用于字符串的二维数组,但不适用于字符的二维数组。 从您的问题中尚不清楚,因此我假设您实际上需要2D字符数组。 语法为: char array [r][c];

值得注意的是,由于您使用了运行时变量rc ,因此该数组是可变长度数组 (VLA)。 这样的数组不能放在文件范围内(“全局”)。 将数组放在像main()这样的函数中。

为了使用VLA,您还必须具有标准的C编译器。 C ++编译器和恐龙编译器不起作用。

由于必须在函数中声明VLA,因此它具有“自动存储持续时间”。 表示它不会自动初始化为零。 如果需要,您必须自己执行以下操作: memset(array, 0, sizeof array); 但是您可能希望将其初始化为某个特定字符而不是0。

例:

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

int main (void)
{
  int r = 5;
  int c = 5;
  char array [r][c];
  memset(array, '#', sizeof array);

  for(size_t i=0; i<r; i++)
  {
    for(size_t j=0; j<c; j++)
    {
      printf("%c", array[i][j]);
    }
    printf("\n");
  }
}

输出:

#####
#####
#####
#####
#####

据我了解,一个新数组充满了“ 0”

const char *array[r][c];

* ,您已经自己在double for循环中填充了它,如下所示:

for(int i = 0; i < r; ++i)
  for(int j = 0; j < c; ++j)
    array[i][j] = 0

因为您的结构是可变大小的数组。

相反,我得到了奇怪的字母和数字

发生这种情况是因为您的代码调用了未定义行为(UB)。

特别是,数组未初始化,如果它们的值已经为0,则尝试将其分配给点字符。

由于未初始化数组,因此其单元格的值是垃圾,因此没有一个满足等于0的条件,因此没有一个分配有点字符。

然后,您打印该数组,该数组仍然包含垃圾值(因为您从未真正对其进行初始化),并且输出是垃圾值。


* 如@hyde所述,这对于本地非静态数组是正确的(这很可能是您的情况)。 静态和全局默认初始化(如果是这种情况,则初始化为零)。

您有几个问题:

  1. 您在声明一个指向所需数组的指针,而不是数组
  2. 只要不知道R和C的编译时间,就不能使用内置数组。 但是,您可以使用VLA(C99,因为只有C标准强制使用VLA,C11再次使它们成为可选),这似乎是一个内置数组,其大小在编译时未知,但具有非常重要的意义,请参阅: https:// /stackoverflow.com/a/54163435/3537677
  3. 当声明为静态变量时,数组仅填充零。
  4. 您似乎错误地将assign =运算符与等于==运算符

因此,通过猜测您想要什么:

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

#define R 5
#define C 5
int r = R;
int c = C;
int i;
int j;
int k = 0;
int area = R*C;

const char array[R][C];


int main() {
    while(k< area){
        for (j = 0; j < c; j++){
            for (i = 0; i<r; i++){
                if (array[i][j] == 0){

                }
                printf("%c",array[i][j]);
                if (i == r - 1){
                    printf("\n");
                }
                k++;

            }
        }

    }

    //or

    char** dynamic_array = malloc(r * c);
    if (dynamic_array == NULL) {
        perror("Malloc of dynamic array failed");
        return EXIT_FAILURE;
    }
    memset(dynamic_array, '0', r*c);

    k = 0;

    while(k< area){
        for (j = 0; j < c; j++){
            for (i = 0; i<r; i++){
                if (dynamic_array[i][j] == 0){

                }
                printf("%c",dynamic_array[i][j]);
                if (i == r - 1){
                    printf("\n");
                }
                k++;

            }
        }

    }

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM