从字符串中提取整数

Extract integer from a string

本文关键字:整数 提取 字符串      更新时间:2023-10-16

我有一个类似"y.x-name"的字符串,其中y和x是0到100之间的数字。从这个字符串中,在C++中将"x"提取到整数变量中的最佳方法是什么。

您可以通过.拆分字符串,并将其直接转换为整数类型。while循环中的第二个数字是您想要的,请参阅示例代码:

template<typename T>
T stringToDecimal(const string& s)
{
    T t = T();
    std::stringstream ss(s);
    ss >> t;
    return t;
}
int func()
{     
    string s("100.3-name");
    std::vector<int> v;
    std::stringstream ss(s);
    string line;
    while(std::getline(ss, line, '.'))
    {
         v.push_back(stringToDecimal<int>(line));
    }
    std::cout << v.back() << std::endl;
}

它将输出:3

这个线程似乎有一个与您类似的问题,它可能会有所帮助;)

用C++进行简单的字符串解析

您可以使用boost::lexical_cast来实现它,它使用类似于billz的answer中的流:伪代码看起来是这样的(在那个例子中索引可能是错误的):

std::string yxString = "56.74-name";
size_t xStart = yxString.find(".") + 1;
size_t xLength = yxString.find("-") - xStart;
int x = boost::lexical_cast<int>( yxString + xStart, xLength );

解析错误可以通过lexical_cast引发的异常来处理。为了更灵活/更强大的文本匹配,我建议使用boost::regex。

unsigned long strtoul( const char *str, char **str_end, int base )使用两个调用,例如:

#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
    char const * s = "1.99-name";
    char *endp;
    unsigned long l1 = strtoul(s,&endp,10);
    if (endp == s || *endp != '.') {
        cerr << "Bad parse" << endl;
        return EXIT_FAILURE;
    }
    s = endp + 1;
    unsigned long l2 = strtoul(s,&endp,10);
    if (endp == s || *endp != '-') {
        cerr << "Bad parse" << endl;
        return EXIT_FAILURE;
    }
    cout << "num 1 = " << l1 << "; num 2 = " << l2 << endl;
    return EXIT_FAILURE;
}