Найти сначала нулевое число в строке C ++ - PullRequest
0 голосов
/ 27 февраля 2020

Здравствуйте, есть ли способ найти первое число (от 1 до 9, без нуля) в строке? Есть ли способ с std :: find или мне нужна другая функция для этого?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Здравствуйте, есть ли способ найти первое число (от 1 до 9, без нуля) в строке?

Для этого вы можете использовать std::find_if:

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

find_if ищет элемент, для которого предикат p возвращает true

#include <string>
#include <algorithm>
#include <cctype>
#include <iostream>

int main()
{
    auto const str = std::string{"hello user #0002654"};
    auto const first_non_zero_it = std::find_if(begin(str), end(str), [](char c) {
        return std::isdigit(c) && c != '0';
    });

    std::cout << *first_non_zero_it << '\n'; // prints 2
}

Демо: https://coliru.stacked-crooked.com/a/e3880961973ce038

1 голос
/ 27 февраля 2020

Вы можете просмотреть std :: string как массив символов с помощью оператора [] и функции size (), чтобы получить его длину. Затем вы можете проверить значения символов от 49 до 57 (в десятичном виде, в соответствии с таблицей ASCII).

РЕДАКТИРОВАТЬ

Как указано в комментариях ниже, это будет Проще сравнить с диапазоном от 1 до 9, чем от 49 до 57. Но в любом случае было бы полезно ознакомиться с различными представлениями символов.

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string search_str = "abcd56";

    for (int i = 0; i < search_str.size(); ++i) {
        if (search_str[i] >= '1' && search_str[i] <= '9') {
            std::cout << "found at " << i << "\n";
            break;
        }
   }
}

Что касается std :: find, Я бы лучше использовал std :: find_first_of, который принимает две пары итераторов, одна указывает на диапазон, в котором нужно искать, а другая - на диапазон элементов для поиска. Если результат std :: find_first_of не равен end () искомого диапазона, то индекс первого элемента можно найти с помощью std :: distance (search_range.begin (), result).

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string search_str = "abcd56";
    std::vector<char> find_range {'1','2','3','4','5','6','7','8','9'};

    auto result = std::find_first_of(search_str.begin(), search_str.end(), find_range.begin(), find_range.end());

    if (result == search_str.end()) {
        std::cout << "no elements were found\n";
    } else {
        std::cout << "found match at "
                  << std::distance(search_str.begin(), result) << "\n";
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...