[英]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];
。
值得注意的是,由於您使用了運行時變量r
和c
,因此該數組是可變長度數組 (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所述,這對於本地非靜態數組是正確的(這很可能是您的情況)。 靜態和全局默認初始化(如果是這種情況,則初始化為零)。
您有幾個問題:
=
運算符與等於==
運算符 因此,通過猜測您想要什么:
#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.