C++中如何确保输入的空格分隔整数数量恰好为指定的n个?
如何确保C++输入的价格数量恰好为n个
在处理这类输入场景时,确实需要严谨的验证逻辑,避免出现数量不符或者无效输入的情况。下面我分享两种实用的方法,帮你精准控制输入的整数数量:
方法一:读取整行后拆分验证(严格限制在第二行输入)
这种方法适合要求价格必须全部在第二行输入的场景,会把第二行的内容完整读取后再拆分计数,同时检查是否有无效字符。
步骤拆解:
- 先读取整数
n,注意要跳过n后面的换行符,否则后续的getline会读取到空行。 - 用
getline读取第二行的完整字符串。 - 通过
stringstream把字符串拆分成整数,逐个存入容器并计数。 - 验证两个关键点:拆分出的整数数量是否等于
n,以及字符串中是否还有剩余的非空白无效字符。
代码示例:
#include <iostream> #include <string> #include <sstream> #include <vector> #include <limits> using namespace std; int main() { int n; // 读取n,同时忽略n后的所有字符直到换行(更稳妥的处理方式) if (!(cin >> n) || n <= 0) { cerr << "Error: 输入的n无效,必须是正整数" << endl; return 1; } cin.ignore(numeric_limits<streamsize>::max(), '\n'); string priceLine; if (!getline(cin, priceLine)) { cerr << "Error: 未读取到价格行" << endl; return 1; } stringstream ss(priceLine); vector<int> prices; int price; // 拆分字符串为整数 while (ss >> price) { prices.push_back(price); } // 检查数量是否匹配 if (prices.size() != n) { cerr << "Error: 输入的价格数量为" << prices.size() << ",预期为" << n << endl; return 1; } // 检查是否有剩余的非空白字符(比如字母、符号等) char invalidChar; if (ss >> invalidChar) { cerr << "Error: 输入包含无效字符或多余内容" << endl; return 1; } // 验证通过,后续处理逻辑 cout << "输入验证通过!价格列表:" << endl; for (int p : prices) { cout << p << " "; } cout << endl; return 0; }
方法二:直接读取并计数(允许价格跨多行输入)
如果场景允许价格分散在多行输入(只要总数是n即可),可以直接用cin逐个读取整数,同时计数,最后检查是否有多余输入。
步骤拆解:
- 读取
n后,循环读取n个整数,每读取一个就存入容器,同时检查输入是否有效(比如是否是整数)。 - 读取完
n个整数后,检查输入流中是否还有剩余的可读取内容(非空白字符),如果有则说明输入数量超出。
代码示例:
#include <iostream> #include <vector> #include <limits> using namespace std; int main() { int n; if (!(cin >> n) || n <= 0) { cerr << "Error: 输入的n无效,必须是正整数" << endl; return 1; } vector<int> prices; prices.reserve(n); // 预分配空间,提升效率 for (int i = 0; i < n; ++i) { int price; if (!(cin >> price)) { cerr << "Error: 第" << i+1 << "个输入不是有效的整数" << endl; return 1; } prices.push_back(price); } // 检查是否有多余输入 char leftover; if (cin >> leftover) { cerr << "Error: 输入的价格数量超出预期的" << n << "个" << endl; return 1; } // 验证通过,后续处理 cout << "输入验证通过!价格列表:" << endl; for (int p : prices) { cout << p << " "; } cout << endl; return 0; }
注意事项
- 两种方法都处理了输入不是整数的情况:当
cin读取失败时,会进入错误状态,这时候我们可以通过!(cin >> price)来检测。 - 方法一中的
cin.ignore用了numeric_limits<streamsize>::max()来忽略所有字符直到换行,比单纯的cin.ignore()更稳妥,避免n后面跟着空格再换行的情况。 - 如果需要严格限制价格必须在第二行输入,优先选择方法一;如果允许价格跨多行,方法二更简洁。
内容的提问来源于stack exchange,提问作者Visluck
相关产品推荐
相关产品推荐

