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

C语言使用动态数组打印空心矩形输出异常问题求助

1. 字符串数组存储可变长度字符的问题

可以实现。你可以用字符指针数组,每个指针指向一段动态分配的内存,通过realloc动态调整内存大小存储可变长度的字符内容,也可以用柔性数组成员实现类似需求。

2. 空心矩形打印代码问题

现有代码核心遗漏/错误点

  • 下标越界:输入校验时访问了myArray[numsEnteredSoFar],该位置尚未赋值,属于越界访问
  • 循环变量复用错误:内层for循环和外层for循环共用变量i,导致外层循环计数被篡改,循环次数不符合预期
  • 中间行打印逻辑缺失:未按高度要求循环打印(高度-2)次中间行,仅打印了1次
  • 可变空格实现逻辑缺失:使用printf("X%sX", ch)的思路时,未给ch分配对应长度的内存、也未填充对应数量的空格字符,直接使用会触发未定义行为

优化实现方案

你不需要手动拼接空格字符串,C标准库的printf支持动态宽度输出,直接用%*s格式符即可实现可变长度的空格输出,示例如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int height, width;
    // 输入高度和宽度,可按需保留你原来的动态扩容输入逻辑
    if (scanf("%d %d", &height, &width) != 2 || height < 3 || width <3 || height >69 || width>69) {
        return -1;
    }

    // 打印顶部边框
    for (int i=0; i<width; i++) {
        putchar('X');
    }
    putchar('\n');

    // 打印中间行,共height-2行
    for (int i=0; i < height-2; i++) {
        // %*s 表示输出宽度为width-2的字符串,传空字符串就会输出width-2个空格
        printf("X%*sX\n", width-2, "");
    }

    // 打印底部边框
    for (int i=0; i<width; i++) {
        putchar('X');
    }
    putchar('\n');

    return 0;
}

如果你坚持要用printf("X%sX", ch)的思路实现,需要补充以下逻辑:

// 分配width-1个字符的空间(width-2个空格 + 字符串结束符\0)
char *ch = malloc(width -1);
if (ch == NULL) return -1;
memset(ch, ' ', width-2);
ch[width-2] = '\0';
// 之后就可以用printf("X%sX\n", ch)打印中间行
free(ch);
3. 延伸问题:如何使用for循环打印等腰三角形

示例实现:

#include <stdio.h>
int main() {
    int rows;
    scanf("%d", &rows);
    for (int i=1; i<=rows; i++) {
        // 打印左侧空格
        for (int j=0; j < rows -i; j++) {
            putchar(' ');
        }
        // 打印星号
        for (int j=0; j < 2*i -1; j++) {
            putchar('*');
        }
        putchar('\n');
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:06:03