как искать часть строки, а не все

0

в c++ как искать только часть строки, начиная с startIndex и заканчивая после некоторого количества символов. в некоторых случаях мне просто нужно искать первые 5 символов для специального символа или строки, почему мне придется переходить ко всей строке, это может быть 1000 символов или кратных тому. что я знаю в библиотеке времени выполнения c++, все функции не поддерживают что-то вроде этого, например strchr, он будет искать всю строку, я не хочу, чтобы я хотел сравнить определенную часть строки с [] к []. Я видел решение этой проблемы с помощью wmemchr, но мне нужно, чтобы она зависела от выбранной в данный момент локали, если кто-нибудь знает, как это сделать, я был бы благодарен.

Также, как сравнить только 2 символа непосредственно относительно локали?

Теги:
string
search
crt

3 ответа

0
Лучший ответ

Я решил это так

int64 Compare(CHAR c1, CHAR c2, bool ignoreCase = false)
{
    return ignoreCase ? _strnicoll(&c1, &c2, 1) : _strncoll(&c1, &c2, 1);
}

int64 IndexOf(const CHAR* buffer, CHAR c, uint count, bool ignoreCase = false)
{
    for (uint i =0; i < count; i++)
    {
        if (Compare(*(buffer + i), c, ignoreCase) == 0)
        {
            return i;
        }
    }
    return npos;
}

int64 LastIndexOf(const CHAR* buffer, CHAR c, uint count, bool ignoreCase = false)
{
    while(--count >= 0)
    {
        if (Compare(*(buffer + count), c, ignoreCase) == 0)
        {
            return count;
        }
    }
    return npos;
}

npos = -1

и указать начальный индекс индекса (buffer + startIndex) в качестве буфера для второго или третьего метода

0

Вы можете использовать std :: substr, чтобы ограничить область поиска:

std::string str = load_some_data();
size_t pos = str.substr(5).find('a');
  • 0
    Спасибо за ответ, производительность для меня является проблемой в этом фрагменте кода, substr возвращает новую копию части строки, мне не нужно копировать для поиска.
0

Я не знаю, как это сделать непосредственно со стандартной библиотекой, но вы могли бы легко сделать свою собственную функцию и strstr.

/* Find str1 within str2, limiting str2 to n characters. */
char * strnstr( char * str1, const char * str2, size_t n )
{
    char * ret;
    char temp = str1[n]; // save our char at n
    str2[n] = NULL; // null terminate str2 at n
    ret = strstr( str1, str2 ); // call into strstr normally
    str2[n] = temp; // restore char so str2 is unmodified
    return ret;
}

Для вашего второго вопроса:

Также, как сравнить только 2 символа непосредственно относительно локали?

Я не уверен, что вы имеете в виду. Вы спрашиваете, как сравнивать два символа напрямую? Если это так, вы можете просто сравнить, как и любые другие значения. if (str1 [n] == str2 [n]) {... сделать что-то...}

  • 0
    спасибо за ваш ответ, но я думаю, что это не очень хорошая практика - менять содержимое данных только для поиска, что, если другой поток одновременно запрашивает строку или ее длину ?? это вызовет проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню