C++菱形星号数组代码问题:星号数量跳变与输入合法性需求
菱形星号生成问题修复与输入验证实现
星号数量跳变的修复
原代码中控制星号数量的循环条件为2 * i - 1,这会让星号数按**1、3、5...**的奇数序列增长,不符合你需要的1→2→3→4→5→4→3→2→1的顺序。只需将星号循环的终止条件改为i,即可让每行星号数等于当前行数i。
同时,原代码的空格计算逻辑是针对奇数星号的对称菱形,要匹配你提供的右对齐输出效果,需调整前置空格的数量:将空格循环的终止条件改为2*n - i,确保整体呈现右对齐的菱形布局。
输入验证实现(仅接受正整数)
原代码未处理非数字输入,若输入特殊字符会导致程序进入错误状态。添加以下逻辑可实现输入验证:
- 检查输入流状态,若输入失败则清空错误标记
- 忽略输入缓冲区中的无效字符,直到换行
- 提示用户重新输入有效正整数
需引入<limits>头文件以使用numeric_limits工具类。
完整修复代码
#include <iostream> #include <limits> using namespace std; int main() { int n; cout << "Enter a number: "; // 输入验证:仅接受正整数 while (!(cin >> n) || n <= 0) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Invalid input! Please enter a positive integer: "; } // 生成菱形上半部分 for (int i = 1; i <= n; i++) { for (int j = 1; j <= 2*n - i; j++) { cout << " "; } for (int j = 1; j <= i; j++) { cout << "*"; } cout << endl; } // 生成菱形下半部分 for (int i = n - 1; i >= 1; i--) { for (int j = 1; j <= 2*n - i; j++) { cout << " "; } for (int j = 1; j <= i; j++) { cout << "*"; } cout << endl; } return 0; }
测试输出(输入5时)
* ** *** **** ***** **** *** ** *
内容的提问来源于stack exchange,提问作者R3troM3rc
相关产品推荐
相关产品推荐

