Конвертировать только цифры в int в std :: string - PullRequest
3 голосов
/ 11 августа 2011

Я пытаюсь преобразовать только цифры из строки в вектор типа int, но вместо этого я получаю коды ASCII для чисел от 0 до 9.

Есть ли способ преобразовать только цифры в целые числа? Думаю, мне придется использовать массив char, поскольку atoi () не работает с std :: string, а метод c_str () не работает для каждого символа, только для всей строки.

#include <cctype>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    string chars_and_numbers = "123a456b789c0";
    vector<int> only_numbers;

    for (int i = 0; i < chars_and_numbers.length(); i++) {
        if (isdigit(chars_and_numbers[i])) {
            cout << chars_and_numbers[i] << " ";
            only_numbers.push_back(int(chars_and_numbers[i]));
        }
    }

    cout << endl;

    for (vector<int>::iterator i = only_numbers.begin(); i != only_numbers.end(); i++) {
        cout << *i << " ";
    }

    return 0;
}

Выход:

1 2 3 4 5 6 7 8 9 0
49 50 51 52 53 54 55 56 57 48

Ответы [ 2 ]

4 голосов
/ 11 августа 2011
ASCII Character    ASCII Code(decimal)  Literal Integer
      '0'               48                      0
      ...               ...                    ...
      '9'               57                      9

int(chars_and_numbers[i]) возвращает вам базовый код ASCII символа ASCII вместо целого литерала, который вы хотите.

Обычно 'i' - '0' приводит к i, если i принадлежит [0, 9].

Например, , '1' - '0' возвращает расстояния между значениями двух символов ASCII (49 - 48), что составляет 1 .

int main() {
    string chars_and_numbers = "123a456b789c0";
    vector<int> only_numbers;

    for (int i = 0; i < chars_and_numbers.length(); i++) {
        if (isdigit(chars_and_numbers[i])) {
            cout << chars_and_numbers[i] << " ";
            // here is what you want
            only_numbers.push_back(chars_and_numbers[i] - '0');
        }
    }

    cout << endl;

    for (vector<int>::iterator i = only_numbers.begin(); i != only_numbers.end(); i++) {
        cout << *i << " ";
    }

    return 0;
}
0 голосов
/ 11 августа 2011

Если желаемый вывод при печати вектора целых представляет собой действительные числа от 0 до 9, вы можете положиться на тот факт, что значения ASCII для «0» - «9» являются последовательными:

only_numbers.push_back(char_and_numbers[i] - '0');

Таким образом, «8» становится «8» - «0», или 56 - 48, что составляет 8.

...