【问题标题】:How can I limit the number of inputs while using istringstream for parsing (C++)如何在使用 istringstream 进行解析时限制输入数量(C++)
【发布时间】:2021-01-31 03:20:25
【问题描述】:

我应该从 cin 获得多行输入,我只需要为每行取 2 个整数。

我使用while(getline(cin, input))istringstream iss(input) 来处理错误。

我使用了iss >> d(double类型变量),iss >> s(字符串类型变量)的返回值

处理错误,例如(1 2 extrainput;即整数整数字符串)

因为我认为没有其他情况输入值既不是双精度也不是字符串

还有其他优雅的方法来限制每行的输入数量吗?

(如果输入值超过3个,则应视为错误情况)

【问题讨论】:

  • 不,没有优雅的方式。这样做的方法是忘记流,而是逐个字符分析输入字符串,看看它是否符合您的期望。
  • @john 谢谢你的回复!

标签: c++


【解决方案1】:

我知道的最优雅的方法就是用自定义类型将其包装在 operator>> 中。

std::istream& operator>>(std::istream& stream, int_pair& pair) {
    std::string tempstring;
    if (!std::getline(stream, tempstring)) return stream;
    std::stringstream line(tempstring);
    int_pair temppair; //temp so that invalid end of line doesn't modify parameter
    line >> temppair.first;
    line >> temppair.second;
    std::getline(line, tempstring);
    if (!tempstring.empty()) stream.setstate(std::ios::failbit);
    pair = temppair;
    return stream;
}

然后使用变得优雅

int main(){
    int_pair one_pair;
    std::cin >> one_pair;
    std::cout << one_pair;
    
    std::vector<int_pair> vector;
    std::copy(std::istream_iterator<int_pair>(std::cin), {}, std::back_inserter(vector));
    std::copy(vector.begin(), vector.end(), std::ostream_iterator<int_pair>(std::cout));
}

http://coliru.stacked-crooked.com/a/0ceb5b7922ac03b5

(我在某处有一个错误,对输入的第二次调用 getline 失败,我不知道为什么,但无论如何,这一点都是有效的)

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多