在C ++中,我需要带有领先零的整数的字符串表示,其中该表示为8位数字和不超过8位数字,如有必要,在右侧截断了数字。我以为我只需使用ostringstream和iomanip.setw()就可以做到这一点:

int num_1 = 3000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_1;
cout << "field: " << out_target.str() << " vs input: " << num_1 << endl;

这里的输出是:

field: 00003000 vs input: 3000

非常好!但是,如果我尝试更大的数量,SETW可以让输出增长超过8个字符:

int num_2 = 2000000000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_2;
cout << "field: " << out_target.str() << " vs input: " << num_2 << endl;
out_target.str("");

输出:

field: 2000000000 vs input: 2000000000

所需的输出为“ 20000000”。没有什么可以阻止我使用第二次操作即可拿起前8个字符,但是iomanip确实缺少现场截断吗? Boost格式会在一步中完成我需要的事情吗?

有帮助吗?

解决方案

我想不出任何方法来截断这样的数字字段。也许它没有实现,因为它会改变价值。

ostream::write() 允许您截断 细绳 缓冲区足够简单,就像在此示例中一样...

    int num_2 = 2000000000;
    ostringstream out_target;

    out_target << setw(8) << setfill('0') << num_2;
    cout << "field: ";
    cout.write(out_target.str().c_str(), 8);
    cout << " vs input: " << num_2 << endl;

其他提示

如果您假设snprintf()会写很多字符可以(我认为这是可以保证的),

char buf[9];
snprintf(buf, 10, "%08d", num);
buf[8] = 0;
cout << std::string(buf) << endl;

我不确定为什么您要20亿与2000万相同。在截断上发出错误的信号可能更有意义,这样:

if (snprintf(buf, 10, "%08d", num) > 8) {
    throw std::exception("oops")
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top