Как сделать сравнение строк без учета регистра?

Массив - это непрерывный блок памяти. Поэтому, если вы хотите удалить первый элемент, вам нужно переместить все следующие элементы в начало по одному элементу:

void remove(void)
{
    memmove(&p[0], &p[1], (MAX_HEAPSIZE - 1) * sizeof(person));
}

Это довольно неэффективно. Появление первого элемента - это обычная операция с кучей, поэтому вы обычно делаете это наоборот - удалите последний элемент массива - это очень быстро, потому что другие элементы массива не затронуты.

void remove(void)
{
    heapsize--;
}

heapsize можно затем использовать как индекс верхнего элемента кучи (если вы, конечно же, сохраните свойство кучи).

Если вы хотите перезаписать первый элемент массива с последним и обнулить память последнего элемента, который больше не используется, вы можете использовать memcpy и memset:

void remove(void)
{
    memcpy(&p[0], &p[heapsize - 1], sizeof(person));
    memset(&p[heapsize - 1], 0x00, sizeof(person));
}

Обнулить память последнего элемент не является строго необходимым, хотя, потому что вы не должны обращаться к нему в первую очередь. Вместо того, чтобы переписать первый элемент последним с помощью memcpy, его также можно выполнить с помощью strcpy и назначения приоритета (как в вашем remove); использование memcpy просто проще.

912
задан Alexander Abakumov 16 July 2019 в 16:08
поделиться

2 ответа

Самый простой способ сделать это (если вы не беспокоитесь о специальных персонажах Unicode) - это позвонить ToupPercas :

var areEqual = string1.toUpperCase() === string2.toUpperCase();
1090
ответ дан 19 December 2019 в 20:20
поделиться

ИЗМЕНИТЬ : этот ответ был первоначально добавлен 9 лет назад. Сегодня вы должны использовать localeCompare с параметром чувствительность: 'акцент' параметр:

 function ciEquals (a, b) {return typeof a === 'string' && typeof b = == 'строка'? a.localeCompare (b, undefined, {чувствительность: 'акцент'}) === 0: a === b; } console.log ("'a' = 'a'?", ciEquals ('a', 'a')); console.log ("'AaA' = 'aAa'?", ciEquals ('AaA', 'aAa')); console.log ("'a' = 'á'?", ciEquals ('a', 'á')); приставка.log ("'a' = 'b'?", ciEquals ('a', 'b')); 

{чувствительность: 'accent'} сообщает localeCompare () , чтобы рассматривать два варианта одной и той же базовой буквы как одну и ту же , если только у них разные акценты (как в третьем примере) выше.

В качестве альтернативы вы можете использовать {чувствительность: 'base'} , которая рассматривает два символа как эквивалентные, если их базовый символ одинаков (поэтому A будет рассматриваться как эквивалент á ).

Обратите внимание , что третий параметр localeCompare не поддерживается в IE10 или более ранних версиях, а также в некоторых мобильных браузерах (см. Диаграмму совместимости на странице, указанной выше), поэтому, если вам нужно поддерживать эти браузеры , вам понадобится какой-то запасной вариант:

function ciEqualsInner(a, b) {
    return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}

function ciEquals(a, b) {
    if (typeof a !== 'string' || typeof b !== 'string') {
        return a === b;
    }

    //      v--- feature detection
    return ciEqualsInner('A', 'a')
        ? ciEqualsInner(a, b)
        : /*  fallback approach here  */;
}

Исходный ответ

Лучший способ провести сравнение без учета регистра в JavaScript - использовать метод RegExp match () с i флаг.

Поиск без учета регистра

Когда обе сравниваемые строки являются переменными (не константами), это немного сложнее, потому что вам нужно сгенерировать RegExp из строки, но передача строки в конструктор RegExp может привести к неправильному совпадения или неудачные совпадения, если в строке есть специальные символы регулярного выражения.

Если вам важна интернационализация, не используйте toLowerCase () или toUpperCase () , так как это не обеспечивает точного сравнения без учета регистра на всех языках.

http://www.i18nguy.com/unicode/turkish-i18n.html

186
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: