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

C代码循环字符全替换问题排查及阶梯状图案实现方法

问题:循环生成阶梯状图案出错,输出全实心$块的原因及修复方案

我尝试编写循环生成阶梯状(半金字塔)图案,但打印时所有#字符均被替换为$字符,输出实心字符行。请问我的int a循环存在什么问题?如何修改才能生成如下阶梯状图案:

#
       ##
      ###
     ####
    #####
   ######
  #######
 ########

而非如下实心块图案:

$$$$$$$$
$$$$$$$$
$$$$$$$$
$$$$$$$$
$$$$$$$$
$$$$$$$$
$$$$$$$$
$$$$$$$$

以下是我的代码:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void){
   int ask = 0;
   char line[9];

   while ( ask < 1 || ask > 8 ) {
      ask = get_int( "Height: ");
   }
   for (int i = 0 ; i < ask; i++)
   {
      for (int j = 0; j < ask; j++)
      {
        line[j] ='#';
         }
         for (int a = 0; a <= strlen(line); a++)
         {
            if (line[a] == '#'){
               line[a] = '$';
            }
         printf("%c", line[a]);
      }
      printf("\n");
   }
}

问题分析

  1. 数组未初始化,strlen行为异常:你定义了char line[9]但没添加字符串结束符\0,strlen(line)会无差别读取内存直到碰到空字符,导致循环次数完全失控,甚至越界访问内存。
  2. 阶梯逻辑完全错误:每次外层循环里,你把line的前ask个位置全设为#,直接让每行都是满字符,完全没有阶梯需要的前置空格,自然输出实心块。
  3. 无差别替换+循环边界错误:a循环里把所有#替换成$,这就是输出全$的直接原因;同时a <= strlen(line)会多循环一次(数组索引从0开始,正确边界应为a < strlen(line)),可能打印出乱码。

修复方案

生成阶梯图案的核心逻辑是:每行先打印总高度 - 当前行号 - 1个空格,再打印当前行号 + 1个#。直接用循环打印更清晰,不需要额外数组存储:

#include <cs50.h>
#include <stdio.h>

int main(void){
   int ask = 0;

   while ( ask < 1 || ask > 8 ) {
      ask = get_int( "Height: ");
   }
   for (int i = 0 ; i < ask; i++)
   {
      // 打印前置空格:每行空格数随行号增加而减少
      for (int j = 0; j < ask - i - 1; j++)
      {
         printf(" ");
      }
      // 打印#字符:每行#的数量随行号增加而增多
      for (int k = 0; k < i + 1; k++)
      {
         printf("#");
      }
      printf("\n");
   }
}

若坚持使用字符数组实现

如果一定要用line数组,需先初始化数组为全空格,再逐行修改右侧的字符为#:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void){
   int ask = 0;
   char line[9];

   while ( ask < 1 || ask > 8 ) {
      ask = get_int( "Height: ");
   }
   // 初始化数组为全空格,并添加结束符
   memset(line, ' ', 8);
   line[8] = '\0';

   for (int i = 0 ; i < ask; i++)
   {
      // 从右往左设置#,每行多一个
      line[7 - i] = '#';
      printf("%s\n", line);
   }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:15:23