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; }
关键逻辑说明
- 输入处理:用
fgets读取输入内容,atoi转换为整数,完全符合教授禁止使用scanf的要求。 - 边界判断:当输入的数值小于等于0时,输出
No print并提前退出程序,避免执行无效循环。 - 循环控制:外层循环负责控制打印的总行数,内层循环分别控制每行的空格数(右对齐场景)和
*的数量,确保每行内容输出完成后再换行。
内容的提问来源于stack exchange,提问作者Gaya
相关产品推荐
相关产品推荐

