лучший способ сравнения строк - PullRequest
0 голосов
/ 09 мая 2020

У меня есть парсер JSON, который отправляет обратный вызов для каждой проанализированной пары ключ-значение. Затем я использую strncmp со статически распределенными строками в своей программе, чтобы проверить, соответствует ли поле какому-либо из полей, которые меня интересуют. Теперь у меня есть дюжина операторов strncmp в if-else:

if (strncmp(input, "apple", sizeof("apple")-1) == 0) 
    {// do something}
else if (strncmp(input, "banana", sizeof("banana")-1) == 0) 
    {// do something}

Я не уверен, что это оптимальный / поддерживаемый способ выполнения работы. Есть ли способ лучше? Я уже предварительно вычисляю длины строк во время компиляции.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Вы можете определить массив stati c строк:

const char *field_names[] = {
    "apple",
    "banana",
    NULL
};

И затем l oop над массивом, проверяя, совпадает ли строка с одним из элементов массива:

for (int i = 0; field_names[i] != NULL; i++) {
    if (!strcmp(input, field_names[i]))
        // Do things
}

Если вам нужно ограничить размер сравнения, вы можете иметь массив структур, сочетающих строку имени + размер.

И если вам нужно выполнить разные действия для каждого из них , вы можете включить в структуру указатель на функцию, чтобы указать, что делать.

0 голосов
/ 09 мая 2020

Зависит от размера вашего набора. Для большого количества длинных шаблонов поиск O (MN), безусловно, не оптимален.

Вы можете сохранить их в наборе ha sh (в среднем O (M)) или в tr ie. Вы даже можете жестко запрограммировать его самостоятельно, если у вас есть действительно фиксированный набор шаблонов из Delphic Oracle и первые буквы распределены между шаблонами более или менее равномерно:

switch(input[0]) {
case 'a': // check that it's an "apple"
          break;
}
...