C++ Вытащить из Char цифры, написанные через пробел

119
08 января 2021, 11:50

есть char b[50] = "11 2 6" или он может быть записан char b[50] = "1 23 6"

как мне вытащить каждое число и записать его отдельно как int?

Answer 1

Самый простой способ, в стиле си (очень простой, если будет два пробела - будет ошибка, но легко поправить)

int main()
{
    char b[50] = "1 23 444";
    int i = 0;
    int n = 0;
    while (true)
    {
        if (isdigit(b[i])) {
            n = n*10 + b[i] - '0';
            i++;
            continue;
        }
        if (b[i] == ' ' || b[i] == '\0') {
            std::cout << n << '\n';
            n = 0;
            i++;
        }
        if (b[i] == '\0') { break;}
    }
}

Но можно написать в стиле с++

int main()
{
    char b[50] = "1 23 444";
    int n;
    std::istringstream  inp(b);
    while(inp >> n)
    {
        std::cout << n << '\n';
    }
}

а добавить это все в вектор или куда захотите, думаю не составит большого труда.

Answer 2

Считывает только числа из вектора а и добавляет их в вектор b.

int main()
{
    const int n = 50;
    char a[n]{ "123  2 34 5  " };
    int b[n];
    int k = 0; // количество получившихся чисел
    int j = 0; 
    for (int i = 0;i < n;++i)
    {
        int num = 0;
        bool p = false;
        while (a[i] >= '0'&&a[i] <= '9')
        {
            num = num * 10 + a[i] - '0';
            ++i;
            p = true;
        }
        if (p)
        {
            b[j] = num;
            ++j;
            ++k;
        }
    }
    for (int i = 0;i < k;++i)
    {
        cout << b[i] << endl;
    }
    return 0;
}
Answer 3

А вот еще:

char b[50] = "1 23 444   65 27";
int res[50];
char *v, *p = strtok_s(b, " ", &v);
for (int i = 0; p; ++i) {
    res[i] = atoi(p);
    p = strtok_s(0, " ", &v);
    cout << res[i] << endl;
}
Answer 4

В С++ это делается фактически в одну строчку

char b[50] = "11 22 33";
std::vector<int> v;
std::istringstream strm(b);
std::copy(std::istream_iterator<int>(strm), std::istream_iterator<int>(),
 std::back_inserter(v));

Фактически в одну строчку это делается и в С

char b[50] = "11 22 33";
int v[10];
const char *ps;
int *pd;
int n;
for (ps = b, pd = v; sscanf(ps, "%d%n", pd, &n) == 1; ps += n, ++pd);

или

const char *ps;
char *pn;
int *pd;
for (ps = b, pd = v; *pd = strtol(ps, &pn, 10), pn != ps; ps = pn, ++pd);

Разумеется, имеет смысл добавить проверку на некорректный вход.

READ ALSO
Как сделать проверку на валидацию перед сабмитом а после показать блок успешной отправки

Как сделать проверку на валидацию перед сабмитом а после показать блок успешной отправки

Надо сделать валидацию перед сабмитом, а после показать блок успешной отправки

102
Как создать массив объектов класса и обращаться к их методам? C# [дубликат]

Как создать массив объектов класса и обращаться к их методам? C# [дубликат]

Вопрос такой, есть у меня массив из объектов класса, например, MyClass:

121