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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:19:02