如何搜索字符串的一部分而不是全部

how to search a part of a string not all of it

本文关键字:一部分 全部 字符串 何搜索 搜索      更新时间:2023-10-16

在 C++ 中 如何只搜索字符串的一部分,从 startIndex 开始,到一些字符计数后结束。 在某些情况下,我只需要在前 5 个字符中搜索一个特殊的字符或字符串,为什么我必须遍历整个字符串,它可能是 1000 个字符或它的倍数。 我在 C++ 运行时库中所知道的, 所有函数都不支持这样的东西,例如 strchr 它将搜索所有字符串,我不希望我想要将字符串的特定部分从 [] 比较到 []。我已经看到了使用 wmemchr 解决该问题的解决方案,但我需要它依赖于当前选择的区域设置,如果有人知道如何做到这一点,我将不胜感激。

还有如何直接比较与区域设置相关的 2 个字符?

我不知道

直接使用标准库执行此操作的方法,但是您可以非常轻松地创建自己的函数和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] ) { ...做点什么... }

您可以使用 std::substr 来限制搜索区域:

std::string str = load_some_data();
size_t pos = str.substr(5).find('a');

我是这样解决的

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;
}

非营利组织 = -1

并指定起始索引传递到 (缓冲区 + startIndex) 作为第二个或第三个方法的缓冲区