You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维数组海龟绘图程序运行异常,请求排查问题

程序逻辑错误排查求助

核心逻辑:通过两个数字设置二维数组尺寸,输入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;
  • 字符读取包含空白字符:scanf("%c")会读取输入数字后的换行符,导致第一次循环处理无效字符。修正为scanf(" %c", &znacka)(前面加空格跳过空白字符),或在读取数字后调用getchar()吃掉换行符。

内容的提问来源于stack exchange,提问作者vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:01:04