gpt4 book ai didi

c++ - 是否有任何 std::istream 操纵器从输入中使用预定义的字符串?

转载 作者:太空狗 更新时间:2023-10-29 23:51:22 26 4
gpt4 key购买 nike

我有这样的字符串:

some text that i'd like to ignore 123 the rest of line

格式是固定的,只是数字有变化。我想阅读这个“123”并忽略其余部分,但验证其余部分是否采用假定格式。如果我使用 scanf,我可以写:

int result = scanf("some text that i'd like to ignore %d the rest of line", &number);
assert(result==1);

然后通过检查结果我可以知道该行的格式是否正确。我正在寻找一些 std::或 boost::方法来执行此操作,例如使用这样的修饰符:

std::cin >> std::check_input("some text that i'd like to ignore") >> number >> std::ws >> std::check_input("the rest of line");
assert(!std::cin.fail());

当然我可以自己写,但我不敢相信没有简单的方法可以只使用 std 或 boost 来做到这一点。

有吗?

编辑:在这种情况下,正则表达式对我来说太过分了。

最佳答案

借助 Boost,您可以使用 Spirit 的 qi::match 操纵器:

std::istringstream input("some text that i'd like to ignore 42 \tthe rest of line");

int number;

if (input >> std::noskipws >> qi::phrase_match(
"some text that i'd like to ignore"
>> qi::int_
>> "the rest of line", qi::space, number))
{
std::cout << "Successfully parsed (" << number << ")\n";
}

打印

Successfully parsed (42)

查看 Live On Coliru

当然,Boost Spirit 比这更强大,但是......它也可以用于像这样的快速解决方案!

完整样本

为后代保留的代码:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_match.hpp>
#include <iostream>
#include <sstream>

namespace qi = boost::spirit::qi;

int main()
{
std::istringstream input("some text that i'd like to ignore 42 \tthe rest of line");

int number;

if (input >> std::noskipws >> qi::phrase_match(
"some text that i'd like to ignore"
>> qi::int_
>> "the rest of line", qi::space, number))
{
std::cout << "Successfully parsed (" << number << ")\n";
}

}

关于c++ - 是否有任何 std::istream 操纵器从输入中使用预定义的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com