我正在尝试进行此处的练习(第246页,第6.23页)http://index-of.es/C++/C%20How%20to%20Program.pdf。我的代码打印了一个12x12的正方形,但是我的代码打印了一个25x25的正方形,但左侧的一半乘以1,而另一半乘以0。为什么?
#include <stdio.h>
#include <stdlib.h>
#define SIZE 50
int main(){
int lifted=1, floor[50][50]={0}, commands[7]={1,2,3,4,5,6,9}, spaces, command, north=1, south=0, east=0, west=0, row=25, column=25, i, max=1;
while(command!=9){
printf("Enter a command: ");
scanf("%d",&command);
switch(command){
case 1:
lifted=1;
break;
case 2:
lifted=0;
break;
case 3:
if(north==1){
north=0;
east=1;
}else if(south==1){
south=0;
west=1;
}else if(west==1){
north=1;
west=0;
}else if(east==1){
south=1;
east=0;
}
break;
case 4:
if(north==1){
north=0;
west=1;
}else if(south==1){
south=0;
east=1;
}else if(west==1){
west=0;
south=1;
}else if(east==1){
north=1;
east=0;
}
break;
case 5:
printf("Enter a number of spaces: ");
scanf("%d",&spaces);
max=spaces;
break;
case 6:
for(i=0; i<50; i++){
for(int j=0; j<50; j++){
printf("%d ",floor[i][j]);
}
printf("\n");
}
break;
case 9:
exit(0);
}
if(lifted==0){
for(i=0; i<max; i++){
if(north==1){
row--;
}else if(south==1){
row++;
}else if(east==1){
column++;
}else if(west==1){
column--;
}
floor[row][column]=1;
}
}
}
return 0;
}
输出未绘制12x12正方形。为什么?请帮我。基本上我不知道该怎么办。有人可以找到错误吗?我已经进行了一天以上的练习。谢谢。
答案 0 :(得分:0)
输出不会输出12x12的正方形,因为以下代码将打印50行,每行50个数字。
for(i=0; i<50; i++){
for(int j=0; j<50; j++){
printf("%d ",floor[i][j]);
}
printf("\n");
}
您在原始问题中描述的输出明显损坏的原因可能与以下代码有关:
if(lifted==0){
for(i=0; i<max; i++){
if(north==1){
row--;
}else if(south==1){
row++;
}else if(east==1){
column++;
}else if(west==1){
column--;
}
floor[row][column]=1;
}
}
这正在执行未经检查的数组访问,这可能导致未定义的行为,包括覆盖不应由该代码写入的内存。那可以解释各种奇怪的结果。 为了防止这种情况,您需要添加四项检查,每项检查50x50网格的边缘。例如:
if(north==1){
if(--row < 0){
row = 0;
}
}else if(south==1) ...