gpt4 book ai didi

c++ - 在 C++ 中替代 sscanf_s

转载 作者:行者123 更新时间:2023-11-30 04:56:05 26 4
gpt4 key购买 nike

result = sscanf_s(line.c_str(), "data (%d,%d)", &a, &b);

在上面的代码中,我使用 sscanf_s 从给定的字符串 line 中提取两个整数值。在 C++11 中是否有另一种更面向对象的方法? (std::stringstream 和/或正则表达式?)

编辑:我尝试了两种解决方案,第一种不起作用,第二种起作用

// solution one (doesn't work)
// let line = "data (3,4)"
std::regex re("data (.*,.*)");
std::smatch m;

if (std::regex_search(line, m, re) )
cout << m[0] << " "<< m[1]; // I get the string "data (3,4) (3,4)"

// solution two (works but is somewhat ugly)
std::string name;
char openParenthesis;
char comma;
char closeParenthesis;
int x = 0, y = 0;

std::istringstream stream(line);
stream >> name >> openParenthesis >> a >> comma >> b >> closeParenthesis;

if( name=="data" && openParenthesis == '(' && comma == ',' && closeParenthesis == ')' )
{
a = x;
b = y;
}

编辑 2:根据 Shawn 的输入,以下内容完美运行:

    std::regex re(R"(data \(\s*(\d+),\s*(\d+)\))");
std::smatch m;

if (std::regex_search(line, m, re) )
{
a = std::stoi(m[1]);
b = std::stoi(m[2]);
}

最佳答案

如果它不必是正则表达式本身,您可以使用Boost.Spirit .以下是对 this example 的轻微修改并在 vector 中为您提供任意数量的逗号分隔整数。 (这不完全是您所要求的,但展示了一些其他可能的东西,而且我不想花更多的精力来更改示例)。

这适用于迭代器,即字符串和流。它还可以轻松扩展到更复杂的语法,并且您可以创建独立的语法对象,您可以重复使用,或组合成更复杂的语法。 (这里不演示。)

#include "boost/spirit/include/qi.hpp"
#include "boost/spirit/include/phoenix_core.hpp"
#include "boost/spirit/include/phoenix_operator.hpp"
#include "boost/spirit/include/phoenix_stl.hpp"

#include <iostream>
#include <string>
#include <vector>

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;

template < typename Iterator >
bool parse_data( Iterator first, Iterator last, std::vector< int > & v )
{
bool r = qi::phrase_parse( first, last,
// Begin grammar
(
qi::lit( "data" ) >> '('
>> qi::int_[ phoenix::push_back( phoenix::ref( v ), qi::_1 ) ]
>> *( ',' >> qi::int_[ phoenix::push_back( phoenix::ref( v ), qi::_1 ) ] )
>> ')'
),
// End grammar
ascii::space );

if ( first != last ) // fail if we did not get a full match
{
return false;
}

return r;
}

int main()
{
std::string input = "data (38,4)";
std::vector< int > v;
if ( parse_data( input.begin(), input.end(), v ) )
{
std::cout << "Read:\n";
for ( auto i : v )
{
std::cout << i << "\n";
}
}
else
{
std::cout << "Failed.\n";
}

return 0;
}

关于c++ - 在 C++ 中替代 sscanf_s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770190/

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