Лучший способ проиллюстрировать мой вопрос с помощью этого примера (который не работает, если я использую strstr
CRT-функцию):
const wchar_t* s1 = L"Hauptstraße ist die längste";
const wchar_t* s2 = L"Hauptstrasse";
bool b_s1_starts_with_s2 = !!wcsstr(s1, s2);
_ASSERT(b_s1_starts_with_s2); //Should be true
Пока что единственныйWinAPI, который, по-видимому, распознает лингвистическую эквивалентность строк, равен CompareStringEx
при использовании с флагом LINGUISTIC_IGNORECASE
, но его несколько сложно и неэффективно использовать для этой цели, поскольку мне придется вызывать его на s2
до тех пор, пока я не достигну его конца.
Так что мне было интересно, есть ли лучший способ сделать это (под Windows)?
РЕДАКТИРОВАТЬ: Вот что я имею в виду:
bool b_s1_starts_with_s2 = false;
int ln1 = (int)wcslen(s1);
int ln2 = (int)wcslen(s2);
for(int p = 1; p <= ln1; p++)
{
if(::CompareString(LOCALE_USER_DEFAULT, LINGUISTIC_IGNORECASE,
s1, p,
s2, ln2) == CSTR_EQUAL)
{
//Match
b_s1_starts_with_s2 = true;
break;
}
}