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

C语言实现用户输入尺寸的字符直角三角形打印问题求助

解决C语言打印直角三角形的问题

原代码的核心错误

  • 内层循环里printf("*\n")会让每个*单独换行,导致输出完全混乱,应该只打印*不换行,等一行的*全部打完后再统一换行。
  • 空格的打印逻辑错误,位置和数量都不符合要求,没有用循环来控制每行需要的空格数。
  • 输入判断不完整,只判断了a == 0,但输入负数或非数字内容时atoi也会返回0,且判断后没有提前退出程序,会继续执行后续无效循环。

正确实现方案

方案1:左对齐直角三角形(输入4的输出)

*
**
***
****

代码:

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

int main() {
    char s[80];
    int a, i, j;

    fgets(s, sizeof(s), stdin);
    a = atoi(s);

    if (a <= 0) {
        printf("No print\n");
        return 0;
    }

    // 外层循环控制总行数,共a行
    for (i = 1; i <= a; i++) {
        // 内层循环打印i个*
        for (j = 1; j <= i; j++) {
            printf("*");
        }
        // 每行结束后换行
        printf("\n");
    }

    return 0;
}

方案2:右对齐直角三角形(输入4的输出)

*
  **
 ***
****

代码:

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

int main() {
    char s[80];
    int a, i, j;

    fgets(s, sizeof(s), stdin);
    a = atoi(s);

    if (a <= 0) {
        printf("No print\n");
        return 0;
    }

    // 外层循环控制总行数,共a行
    for (i = 1; i <= a; i++) {
        // 先打印(a - i)个空格,实现右对齐效果
        for (j = 1; j <= a - i; j++) {
            printf(" ");
        }
        // 再打印i个*
        for (j = 1; j <= i; j++) {
            printf("*");
        }
        // 每行结束后换行
        printf("\n");
    }

    return 0;
}

关键逻辑说明

  1. 输入处理:用fgets读取输入内容,atoi转换为整数,完全符合教授禁止使用scanf的要求。
  2. 边界判断:当输入的数值小于等于0时,输出No print并提前退出程序,避免执行无效循环。
  3. 循环控制:外层循环负责控制打印的总行数,内层循环分别控制每行的空格数(右对齐场景)和*的数量,确保每行内容输出完成后再换行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:36:10