二维数组海龟绘图程序运行异常,请求排查问题
程序逻辑错误排查求助
核心逻辑:通过两个数字设置二维数组尺寸,输入v、<、>、^控制海龟移动方向,输入o标记当前位置,输入x结束程序。输入测试用例后,程序输出与预期不符,以下是测试用例、代码及问题排查:
测试用例
5 15 ovovovovo>vo>o>^o^o^o^o>>ovovovovovo^^>o>^o^<o>>>ovovovovovo^^>o>^o^<ovv>vov>o>>vovovovovvox
问题代码
#include <stdio.h> #include <stdlib.h> int main() { int hor; int vert; int x = 0; int y = 0; int i, a; char znacka = 'z'; scanf("%d%d", &vert, &hor); char* arr = (char*)malloc(vert * hor * sizeof(char)); arr[x *vert + y] = 'o'; for ( i = 0; i < vert; i++ ) { for( a = 0; a < hor; a++ ) arr[ i * vert + a ] = '.'; } while( znacka != 'x' ) { scanf("%c", &znacka); if ( znacka == '^' ) x--; else if ( znacka == 'v' ) x++; else if ( znacka == '>' ) y++; else if ( znacka == '<' ) y--; else if ( znacka == 'o' ) arr[x *vert + y] = 'o'; if(y < 0) y = vert - 1; else if(y > vert) y = 0; if(x < 0) x = hor - 1; else if(x > hor) x = 0; } for ( i = 0; i < vert; i++ ) { for( a = 0; a < hor; a++ ) { printf("%c",arr [i *vert + a]); } printf("\n"); } free(arr); return 0; }
错误点及修正方案
- 初始化顺序错误:先设置初始位置的
'o',再用循环将所有元素设为'.',导致初始标记被覆盖。修正:先执行数组初始化循环,再设置arr[x * hor + y] = 'o'。 - 数组索引计算错误:一维数组模拟二维数组时,正确索引应为
行号 * 列数 + 列号,即i * hor + a(vert是行数,hor是列数),当前代码错误使用i * vert + a,标记位置时也错误使用x * vert + y,需统一改为x * hor + y和i * hor + a。 - 边界判断逻辑完全颠倒:
- y是列索引,范围应为
0 ~ hor-1,当前错误与vert比较,修正为:if(y < 0) y = hor - 1; else if(y >= hor) y = 0; - x是行索引,范围应为
0 ~ vert-1,当前错误与hor比较,修正为:if(x < 0) x = vert - 1; else if(x >= vert) x = 0;
- y是列索引,范围应为
- 字符读取包含空白字符:
scanf("%c")会读取输入数字后的换行符,导致第一次循环处理无效字符。修正为scanf(" %c", &znacka)(前面加空格跳过空白字符),或在读取数字后调用getchar()吃掉换行符。
内容的提问来源于stack exchange,提问作者vladimir
相关产品推荐
相关产品推荐

