对于我的代码,用户输入位置的经度和纬度以及位置名称。例如,“ 33.9425 / N 118.4081 / W洛杉矶国际机场”。然后,程序使用经度和纬度计算一些信息。我是C ++的新手,但是我想到了使用python的字符串切片技术。但是,我不确定坐标将是多少位数,因此无法手动对其进行切片。在C ++中是否有一种方法只能将数字保留到特定字符?例如,仅获得33.9425和118.4081?
答案 0 :(得分:0)
是的,您可以使用
string s {"abc"};
s.find("b");
评估符号的首次出现,然后使用substr()方法对字符串进行切片。
答案 1 :(得分:0)
这是经典的正则表达式问题。看看std::regex。我自己可以使用std::regex_iterator进行此操作。这应该起作用:
#include <map>
#include <string>
#include <tuple>
#include <utility>
namespace web
{
enum class attrs
{ charset, name, content, http_equiv, rel, href, id, src, lang };
using attribute = std::pair<attrs, std::string>;
using attribute_type = std::map<attrs, std::string>;
const auto none = attribute_type{};
enum tag_name
{ html, head, meta, title, link, body, div, script, plain, p, h1, span };
template <typename... Tags>
struct node
{
int increment;
std::tuple<Tags...> tags;
explicit node (int const incr, Tags ... tggs)
: increment{incr}, tags{tggs...}
{ }
};
template <tag_name>
struct w
{ };
template <tag_name T, typename ... Tags>
struct tag
{
attribute_type attributes;
std::tuple<Tags...> tags;
explicit tag (attribute_type atts)
: attributes{std::move(atts)}
{ }
explicit tag (w<T>, attribute_type atts, Tags... tggs)
: attributes{std::move(atts)}, tags{tggs...}
{ }
};
template <>
struct tag<plain>
{
std::string content;
explicit tag (std::string val) : content{std::move(val)}
{ }
};
} // namespace web
int main ()
{
using namespace web;
node page1{2};
node page2{2, tag<html>{none}};
node page3{2, tag<html>{{{attrs::lang, "en"}}}};
node page4{2, tag<html>{{{attrs::name, "viewport"},
{attrs::content, "width=device-width, initial-scale=1.0"}}}};
node page5{2, tag<head>{none}, tag<body>{none},
tag<plain>{"Hello World"}};
node page6{1, tag{w<span>{}, none, tag<h1>{none}}};
}
输出:
#include <regex>
#include <iterator>
#include <iostream>
#include <string>
int main()
{
const std::string s = "33.9425/N 118.4081/W Los Angeles International Airport";
std::regex words_regex("\\d+\\.\\d+");
auto words_begin =
std::sregex_iterator(s.begin(), s.end(), words_regex);
auto words_end = std::sregex_iterator();
std::cout << "Found "
<< std::distance(words_begin, words_end)
<< " numbers:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
std::smatch match = *i;
std::string match_str = match.str();
std::cout << match_str << '\n';
}
}
完全公开:我只是从cppreference.com的示例中Found 2 numbers:
33.9425
118.4081
中提取了上述内容,并对其进行了更改,而不是我自己的代码:)