正如标题所说,当我尝试打印二维数组时,我的程序崩溃了。
函数printf
中的错误肯定是printarray
,但我无法理解它导致崩溃的原因。
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define COL 40
#define ROW 40
void printarray(int array[COL][ROW], int col, int row);
main (){
int n,m,p,q;
int array[COL][ROW];
printf("Dammi 2 numeri \n"); scanf("%d",&n); scanf("%d",&m);
do{
printf("Dammi 2 p[<n] e q[<m] \n"); scanf("%d",&p); scanf("%d",&q);
}while(p>=n || q>=m);
printf("Mi hai dato: n= %d m= %d p= %d q= %d \n",n,m,p,q);
int i,j;
int random;
srand(time(NULL));
for(i=0; i<=n;i++){
for(j=0; j<=m;j++){
do{
random = rand() % 10;
}while(random == 0);
printf("\n i am at array[%d][%d] with number: %d\n",i,j,random);
array[i][j] = random;
}
}
//printf("lol0 ->>>>>>>>>>>%d<--------",array[0][0]);
printarray(array[n][m],n,m);
system("PAUSE");
}
void printarray(int array[COL][ROW], int col, int row){
int i,j;
for(i=0; i<=col;i++){
//printf("lol3 %d",i);
for(j=0; j<=row; j++){
printf("%d",array[i][j]);
}
printf("\n");
}
}
答案 0 :(得分:4)
如果数组维度的大小为N,则索引的有效范围为[0, N - 1]
。
所以函数中的循环应该看起来像
void printarray(int array[COL][ROW], int col, int row){
int i,j;
for(i=0; i< col;i++){
//printf("lol3 %d",i);
for( j=0; j<row; j++){
printf("%d",array[i][j]);
}
printf("\n");
}
}
同样适用于main中的循环。
此函数调用无效
printarray(array[n][m],n,m);
应该有
printarray(array,n,m);
考虑到像
这样的数组声明int array[COL][ROW];
非常混乱。写
会更正确int array[ROW][COL];
^^^ ^^^
此循环
中变量p和q的含义还不清楚does not make sense
printf("Dammi 2 numeri \n"); scanf("%d",&n); scanf("%d",&m);
do{
printf("Dammi 2 p[<n] e q[<m] \n"); scanf("%d",&p); scanf("%d",&q);
}while(p>=n || q>=m);
似乎这个循环来自其他程序。:)
你必须检查n和m是否大于ROW和COL。
将意大利语与英语混合起来也是一个坏主意。:)
答案 1 :(得分:1)
由于多种原因,发布的代码无法完全编译。
1)缺少
#include <time.h>
2)function main()总是返回&#39; int&#39;所以一个适当的主要陈述是:&#39; int main(void)&#39;
3)&#39; printarray()&#39;的第一个参数被定义为指向二维数组的指针。
然而,
a)实际通话传递特定“小区”的内容。在数组中。
b)通过的&#39;小区&#39;超出阵列的末尾。建议:&#39; printarray(array,n,m)&#39;作为调用声明。
注意,在C中,数组名称降级为数组中第一个条目的地址。
4)数组应定义为arrayName [numRows] [numColumns]。
当声明指针数组时,这将变得更加重要,其中每个指针将指向相关行的内容。
在发布的代码中,定义/命名是典型的倒退。
在Memory中,一个数组从左到右(列)然后从上到下(行)排列。
最大的&#39; index是行,应该先列出。
5)为避免文本替换问题,宏中的数值应包含在parens中。
6)作为建议,代码块之间适当的垂直间距(空白行)使代码更清晰,更容易被人类理解
7)当调用scanf()(和函数族)时,总是检查返回值(而不是参数值)以确保操作成功
8)一致的缩进使我们的人类更容易阅读/理解代码,建议:在每个开口支撑后缩进4个空格&#39; {&#39;并且在每个结束括号之前取消缩进&#39;}。注意:切勿使用制表符进行缩进。不同的环境具有不同的标签宽度和/或不同的制表位。9)为了便于阅读,并且为了使调试更容易,每行代码只放置一个语句。这适用于声明变量,因此可以轻松地对它们进行注释并应用于可执行语句
答案 2 :(得分:-1)
这里我正在附加你的程序,没有任何错误。问题是调用printarray函数。
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define COL 40
#define ROW 40
void printarray(int array[COL][ROW], int col, int row);
main (){
int n,m,p,q;
int array[COL][ROW];
printf("Dammi 2 numeri \n"); scanf("%d",&n); scanf("%d",&m);
do{
printf("Dammi 2 p[<n] e q[<m] \n"); scanf("%d",&p); scanf("%d",&q);
}while(p>=n || q>=m);
printf("Mi hai dato: n= %d m= %d p= %d q= %d \n",n,m,p,q);
int i,j;
int random;
srand(time(NULL));
for(i=0; i<=n;i++){
for(j=0; j<=m;j++){
do{
random = rand() % 10;
}while(random == 0);
printf("\n i am at array[%d][%d] with number: %d\n",i,j,random);
array[i][j] = random;
}
}
//printf("lol0 ->>>>>>>>>>>%d<--------",array[0][0]);
printarray(array,n,m);
system("PAUSE");
}
void printarray(int array[COL][ROW], int col, int row){
int i,j;
for(i=0; i<=col;i++){
//printf("lol3 %d",i);
for(j=0; j<=row; j++){
printf("%d",array[i][j]);
}
printf("\n");
}
}