【问题标题】:Limit the istream read width for integers限制整数的 istream 读取宽度
【发布时间】:2020-01-14 07:51:42
【问题描述】:

我有一个包含“1514”之类数据的流,我想读取两个数字 15 和 14。

我尝试使用std::setw,但它似乎不适用于整数。

#include <sstream>
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    stringstream stringStream("1415");
    string s1,s2;
    stringStream>>setw(2)>>s1>>setw(2)>>s2;
    cout<<"s1: "<<s1<<", s2: "<<s2<<endl;

    stringstream intStream("1415");
    int i1,i2;
    intStream>>setw(2)>>i1>>setw(2)>>i2;
    cout<<"i1: "<<i1<<", i2: "<<i2<<endl;
}

我希望在完成字符串时解析整数。

所以我想要 i1=14 和 i2=15。

【问题讨论】:

  • 整体阅读,稍后除以 100(第一部分)和模 100(第二部分)进行拆分
  • 生成的字符串可能太大而无法放入长字符串。
  • 读取为字符串,中间拆分,如果需要,将每个部分转换为long/integer
  • 确实 setw on input 仅适用于字符串。您可以通过读取字符串并使用strtodstoi 将它们转换为整数来利用它。

标签: c++ std istream


【解决方案1】:

简单的方法:首先创建一个包含 3 个字符的数组并使用空终止符进行初始化:

char arr[3]{};

从 iostream 中提取两个字符:

stringStream.get(arr, 2);

将子字符串转换为整数:

// alternatives: std::strtol, boost::lexical_cast
std::istringstream subss(arr);
int i1;
subss >> i1;

重复接下来的两位数。


复杂方法:使用解析器生成器。遵循 BNF 可能会奏效:

<input>  ::= <i1><i2>
<i1>     ::= <twodig>
<i2>     ::= <twodig>
<twodig> ::= <digit><digit>

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2021-12-24
    • 2011-02-23
    • 2011-07-27
    • 2014-09-05
    相关资源
    最近更新 更多