C ++将带字和数字的字符串转换为数字

时间:2016-04-20 04:44:46

标签: c++

如何在3 word 12 with word中不使用312的情况下,将stoi之类的字符串转换为仅包含数字C++的字符串?当我尝试使用它时,我的Codeblode给了我一个错误stoi is not a member of std

提前谢谢!

3 个答案:

答案 0 :(得分:1)

浏览该行并跳过非数字符号。对于数字,使用-'0'转换和*10转换方法。 E.G:

#include <stdio.h>
#include <ctype.h>
//or cctype to use isdigit()
#include <string.h>
//or cstring to use strlen()

int main()
{
    char str[] = "3 word 12 with word"; // can be any string
    int result = 0; // to store resulting number
    // begin of solution
    for (int i = 0; i < strlen(str); i++)
    {
        if (isdigit(str[i]))
        {
            result *= 10;
            result += str[i] - int('0');
        }
    }
    // end of solution
    printf("%d\n", result);
    return 0;
}

答案 1 :(得分:1)

VolAnd's answer中的想法相同。只是,因为问题被标记为c++,使用了一些STL内容。

#include <iostream>
#include <numeric>
#include <string>
using namespace std;

int main(){
    std::string input("3 word 12 with word");

    int num = std::accumulate(input.begin(), input.end(), 0,
            [](int val, const char elem) {
                if (isdigit(elem)) {
                    val = val*10 + (elem-'0');
                }
                return val;
        }
    );

    std::cout << num << std::endl;
    return 0;
}

请参阅http://en.cppreference.com/w/cpp/algorithm/accumulate

注意:如果你想允许一个领先的减号,它会变得更有趣......

在这个问题上使用boost::adaptors::filter(rng, pred)会很有趣,但会稍微过分; - )

答案 2 :(得分:0)

假设s是您的初始字符串。

int toInt(string s) {
    string digits;
    for(size_t i = 0; i < s.size(); i++)
        if(s[i] >= '0' && s[i] <= '9')
            digits.push_back(s[i]);

    int res = 0;
    for(size_t i = 0; i < digits.size(); i++)
        res = res * 10 + digits[i] - '0';
    return res;
}

前导零不是问题。 但请注意,如果生成的digits字符串包含大数字,则可能会收到溢出。