如何在C ++中提取符号前的数字

How to extract number before a symbol in C++

我试过谷歌搜索,但就是找不到我的答案。

我有一个字符串“0-9”。我想提取破折号前后的数字并将其存储在变量中

e.g
string A = "0-9";
output:
min = 0
max = 9

我在破折号之后拿到了号码,但之前没有。

string str = "0-9";
string max = str.substr(str.find("-") + 1);
cout << max;

它也应该适用于“10-20”。

https://www.cplusplus.com/reference/string/string/substr/

string substr (size_t pos = 0, size_t len = npos) const;

string str = "0-9";
string min = str.substr(0, str.find("-"));
cout << min;
     auto dashPos = A.find('-');
     auto before = A.substr(0,dashPos);
     auto after = A.substr(dashPos + 1);
#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <iostream>

int main() {
    int min, max;
    std::string s = "0-9";
    sscanf(s.data(), "%d-%d", &min, &max);
    std::cout << min << ", " << max;
}

就个人而言,我觉得这个运算符非常方便:

#include <iostream>
#include <cctype>

std::istream& operator>>(std::istream& is, char const* s) {

        if (is.flags() & std::ios::skipws) {
                while (std::isspace(is.peek()))
                        is.ignore(1);

                while (std::isspace((unsigned char)* s))
                        ++s;
        }

        while (*s && is.peek() == *s) {
                is.ignore(1);
                ++s;
        }
        if (*s)
                is.setstate(std::ios::failbit);
        return is;
}

这使您可以从输入流中“读取”字符串文字。这样做时,它会从流中读取输入并将其与您传递的文字进行匹配。如果它们不匹配,它会设置流的失败位。如果它们确实匹配,它会使用流中的匹配数据。

我认为这听起来比实际情况要复杂。在实际使用中,你会做这样的事情:

std::istringstream input{"10-29"};

int min;
int max;

input >> min >> "-" >> max; // min = 10, max=29

这也可以识别流的 skipws 标志。如果已设置(通常是这样),它会在尝试读取您指定的分隔符之前跳过白色 space,因此像 1 - 20 这样的输入也可以工作。

我实际上喜欢这个 regex 的解决方案。它非常简单,实际上使用了 match_results.

prefixsuffix 属性
#include <string>
#include <iostream>
#include <regex>
int main(int argc, char * argv[]){
    std::string A = "0-9";
    std::cmatch cm;
    std::regex_search(A.c_str(), cm, std::regex("-"));
    int nums[2]{ std::stoi(cm.prefix()), std::stoi(cm.suffix()) };
    for (auto i : nums) {
        std::cout << i << '\n';
    }
    return 0;
}