Поиск числа в строке c++

110
11 марта 2022, 12:30

В файле содержится строка "Число 10 число 20". Первое число обрабатывается, а на второе выдает стабильно 0. При этом, если выводить только индексы первых элементов чисел в строке (6 и 16) - все работает. В чем может быть проблема?

int main()
{
    setlocale(LC_CTYPE, "rus");
    string line;
    ifstream in("F:\\foo.txt"); 
    if (in.is_open())
    {
        getline(in, line);
    }
    int digits = line.find_first_of("1234567890");
    int digits2 = line.find_last_of("1234567890");
    int number = atoi(line.c_str() + digits);
    int number2 = atoi(line.c_str() + digits2);

    cout << number << endl;
    cout << number2 << endl;
    in.close();     
    system("pause");
    return 0;
}
Answer 1

Итак,

int digits2 = line.find_last_of("1234567890");

Что же мы видим в "Число 10 число 20"? Точно! Самую распоследнюю цифру - 0 из 20.

int number2 = atoi(line.c_str() + digits2);

Что же тут такое line.c_str() + digits2? Это строка "0"

Что atoi должен вернуть для такой строки, как не 0?

И чему вы удивлены? И - с индексами:

 Число 10 число 20
           1111111
 01234567890123456

Все верно, 6 - индекс, с которого начинается 10 число 20, 16 - индекс последнего нуля...

Answer 2

При этом, если выводить только индексы первых элементов чисел в строке (6 и 16) - все работает

Вы совершенно правильно заметили, что второй индекс равен 16. А теперь посмотрите, на какой символ он указывает

Число 10 число 20
^^^^^^^^^^^^^^^^^
          1111111
01234567890123456

Т.е. digits2 указывает на последнюю цифру в строке. Что как бы логично. Строка

int digits2 = line.find_last_of("1234567890");

находит последнее вхождение цифры.

Чтобы программа работала, вам нужно сместиться влево от digits2 на начало числа

Answer 3

Алгоритм решения: (предлагаю Вам переписать Ваш вариант)

1) Разбить строки на лексемы через stringstream

2) проверить цифры или нет

3) обработать (сделать то, что Вам нужно)

Вместо файла будет просто строка(представим что Вы туда сдампили файл) Вот Вам 2 схожих метода как это сделать

#include <iostream> 
#include <sstream> 
#include <algorithm>
#include <vector>
#include <cctype>
#include <iterator>

void foo(std::string str) {
    std::cout << "first" << std::endl;
    std::stringstream ss{ str };
    std::string tmp{};
    std::vector<int64_t> data_v;
    while (ss >> tmp) {
        if (std::all_of(std::begin(tmp), std::end(tmp), std::isdigit)) {
            data_v.push_back(std::stoi(tmp));
        }
    }
    for (const auto& v : data_v) {
        std::cout << v << std::endl;
    }
}

void foo2(std::string str) {
    std::cout << "second" << std::endl;

    std::stringstream ss(str);
    std::istream_iterator<std::string> begin(ss), end;
    std::vector<std::string> vec_str(begin, end);
    std::vector<int> data_v;
    auto f{ [&](const std::string& s) { if (std::count_if(std::begin(s), std::end(s), std::isdigit) == s.size()) { data_v.push_back(std::atoi(s.c_str())); }} };
    std::for_each(std::begin(vec_str), std::end(vec_str), f);
    for (const auto& v : data_v) {
        std::cout << v << std::endl;
    }
}

int main() {
    std::string str{ "num 10 num 20" };
    foo(str);
    foo2(str);
    return 0;
}
READ ALSO
Почему не выводится MessageBox?

Почему не выводится MessageBox?

Почему не появляется MessageBox перед закрытием программы - после завершения оконной процедуры и соблюдения условия его вызова? А появляется...

120
В файле дописать к каждому слову текст

В файле дописать к каждому слову текст

Имеется файл inputtxt с таким содержимым: qwer qwe qwe qwerty

237
Удаление элементов из vector_pair

Удаление элементов из vector_pair

Я хочу удалить элементы v[i+1]first и v[i+1]

90
c++ гигантский массив

c++ гигантский массив

Как на с++ сделать матрицу размером 10^5, у меня получается но только 10^4

73