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
相关产品推荐
相关产品推荐

