填充和打印2D阵列

时间:2019-02-07 09:10:21

标签: c arrays

所以我有一个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,虽然运气不好,但输出却有所不同。我在%s的位置上得到了一些点,但仍然不在网格上,并且出现了怪异的值。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

由于必须在函数内声明VLA,因此它具有“自动存储持续时间”。表示 not 不会自动初始化为零。如果需要,您必须自己执行此操作: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");
  }
}

输出:

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

答案 1 :(得分:0)

  

据我了解,新数组中填充了'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所述,这对于本地非静态数组是正确的(这很可能是您的情况)。静态和全局默认初始化(如果是这种情况,则初始化为零)。

答案 2 :(得分:-1)

您有几个问题:

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

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

#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;
}
相关问题