所以我有一个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循环中,默认情况下会在新行上显示,这样我就不会得到网格,那么有没有更好的方法呢?
答案 0 :(得分:1)
您拥有的是一个指针数组。这将适用于字符串的二维数组,但不适用于字符的二维数组。从您的问题中尚不清楚,因此我假设您实际上需要2D字符数组。语法为:char array [r][c];
。
值得注意的是,由于您使用了运行时变量r
和c
,因此此数组是可变长度数组(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)
您有几个问题:
=
运算符与==
相等运算符弄错了因此,通过猜测您想要什么:
#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;
}