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

打印实心钻石图案时出现无限循环问题求助

咱们一步步来分析你遇到的无限循环问题,顺便把实心钻石的打印逻辑也修正到位:

首先,无限循环的直接原因:你下半部分的k变量初始值完全错了!当second递减到1的时候,2*second-1等于1,但你把k初始化成了rows(比如输入rows=3时k=3),然后在while循环里让k一直递增,它永远不可能等于1,自然就死循环了。

再仔细看你的代码,还有几个逻辑错误:

  • 变量初始化时机错了:你把k=rows放在打印空格的for循环增量里,这意味着每次j循环结束后才会赋值,而且这个值完全不符合星号计数的需求——上半部分用n=0来从零开始数星号数量,下半部分也应该用同样的逻辑,把k初始化为0。
  • 下半部分循环范围错了:你从second=rows开始循环,会导致重复打印上半部分最后一行的最大星号行,最终钻石会有2rows行(正确的实心钻石应该是2rows-1行),而且当second=1时,星号数量要求是1,但k初始值远大于1,直接触发无限循环。
  • 空格逻辑错了:下半部分的space初始值设为rows完全不对,应该从1开始递增,对应每一行的空格数逐渐增加。

下面是修正后的完整代码,我标注了关键修改点:

#include <stdio.h> 
// 打印实心钻石的程序
int main(){
    int j, k, first, second, rows, space;
    // 移除了冗余的n变量,代码更简洁
    printf("Enter value of n : ");
    scanf("%d", &rows);
    
    // 打印上半部分(包含中间最大的星号行)
    space = rows - 1;
    for (first = 1; first <= rows; first++) {
        // 修正空格循环条件:j<=space 才能打印正确数量的空格
        for(j = 1; j <= space; j++) {
            printf(" ");
        }
        space--;
        k = 0; // 显式初始化星号计数器为0
        while (k != 2*first - 1) {
            printf("*");
            ++k;
        }
        printf("\n");
    }
    
    // 打印下半部分(从中间行的下一行开始到最后一行)
    space = 1;
    // 循环从rows-1开始,避免重复打印中间最大的星号行
    for (second = rows - 1; second >= 1; second--) {
        for(j = 1; j <= space; j++) {
            printf(" ");
        }
        space++;
        k = 0; // 正确初始化计数器,避免垃圾值
        while (k != 2*second - 1) {
            printf("*");
            ++k;
        }
        printf("\n");
    }
    return 0;
}

关键修改说明:

  1. 删掉了没用的n变量,统一用k作为星号计数器,逻辑更清晰。
  2. 上半部分的空格循环条件从j<space改成j<=space,确保每行的空格数正确。
  3. 下半部分的space初始值改为1,每次循环后递增,对应下半部分每行空格数逐渐变多。
  4. 下半部分循环从rows-1开始,这样不会重复打印中间的最大星号行,最终钻石总行数是2*rows-1,符合实心钻石的标准形状。
  5. 每个星号while循环前都显式把计数器设为0,彻底避免了未初始化变量或错误初始值导致的问题。

测试一下,比如输入rows=3,输出会是:

*
 ***
*****
 ***
  *

完美解决了无限循环,同时也打印出了正确的实心钻石。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:37:32