如何在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
.
的 prefix
和 suffix
属性
#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;
}
我试过谷歌搜索,但就是找不到我的答案。
我有一个字符串“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
.
prefix
和 suffix
属性
#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;
}