如何提取字符串中的整数?

时间:2019-05-11 05:47:07

标签: c++

我得到如下一行:"1001", Name

我想知道如何在没有atoi的情况下获取引号之间的数字。

问题是要使函数只获取字符串中两个引号之间的整数,然后获取名称并将其放在字符串中,但我不理解该部分。

3 个答案:

答案 0 :(得分:2)

使用正则表达式进行搜索:

#include <regex>
#include <iostream>

int main()
{
    const std::string s = "\"1001\", John Martin";
    std::regex rgx("\"(\\d+)\", *([\\w ]+)"); // this will extract quoted numbers in any string
    std::smatch match;

    if (std::regex_search(s.begin(), s.end(), match, rgx))
        std::cout << "ID: " << match[1] << ", Name: " << match[2] << '\n';
}

答案 1 :(得分:0)

看看std::istringstream,例如:

std::string s = "\"1001\", Name";
std::string name;
int num;

std::istringstream iss(s);
iss.ignore();
iss >> num;
iss.ignore();
iss.ignore();
std::getline(iss, name);

std::string s = "\"1001\", Name";
std::string name;
int num;

std::istringstream iss(s);
iss.ignore(std::numeric_limits<std::streamsize>::max(), '"');
iss >> num;
iss.ignore(std::numeric_limits<std::streamsize>::max(), ',');
std::getline(iss, name);

std::string s = "\"1001\", Name";
std::string name;
int num;

std::string::size_type start = s.find('"') + 1;
std::string::size_type end = s.find('"', start);
std::string snum = s.substr(start, end - start);

std::istringstream(snum) >> num;

start = s.find(',', end+1) + 1;
start = s.find_first_not_of(' ', start);
name = s.substr(start);

答案 2 :(得分:0)

您还可以使用std::string函数findfind_first_not_ofsubstr来解析信息。

您只需沿原始字符串进行查找,找到开始引号",存储索引,然后找到结束引号及其索引,整数字符串是介于两者之间的字符。

接下来,您可以使用find_first_not_of定位第一个字符而不是", \t"(逗号,空格,制表符),并将名称作为原始字符串的其余部分。

#include <iostream>
#include <string>

int main (void) {

    std::string s = "\"1001\", Name", ssint, ssname;
    size_t begin, end;

    begin = s.find ("\"");                      /* locate opening quote */
    if (begin == std::string::npos) {           /* validate found */
        std::cerr << "error: '\"' not found.\n";
        return 1; 
    }
    end = s.find ("\"", begin + 1);             /* locate closing quote */
    if (end == std::string::npos) {             /* validate found */
        std::cerr << "error: closing '\"' not found.\n";
        return 1; 
    }
    ssint = s.substr (begin + 1, end - 1);      /* int is chars between */

    begin = s.find_first_not_of (", \t", end + 1);  /* find not , space tab */
    if (begin == std::string::npos) {           /* validate found */
        std::cerr << "error: no non-excluded characters found.\n";
        return 1; 
    }
    ssname = s.substr (begin);                  /* name is reamining chars */

    std::cout << "int : " << ssint << "\nname: " << ssname << '\n';
}

注意:始终通过确保返回的结果不是find来验证find_first_not_ofstd::string::npos的结果

使用/输出示例

$ ./bin/parse_str
int : 1001
name: Name

您可以在cppreference - std::basic_string上找到有关所有string库成员函数的详细信息。