簡體   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