Как отсортировать строку с числом по возрастанию

Мне трудно понять, как сортировать строку, в которой есть число.

Строка, которую я отправляю, выглядит как 112:AAAA и 111:EEEE, как мне ее отсортировать, чтобы 111 была первой в массиве, но (и вот что я не могу понять) отсортированный массив должен содержать буквы снова, так что это будет массив строк, отсортированный по номерам и имеющий вид 111:EEEE, 112:AAAA.

Я хотел использовать то, что я видел на C#, имея ключ и значение, но, похоже, этого не существует в коде arduino. Поэтому я импровизировал, записав все в массив из 1 символа.

изменить: я вижу, что смешиваю массив символов и строку, я очень гибкий, и его не проблема изменить на 1 или другой, в настоящее время я использую массивы символов.

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

, 👍1

Обсуждение

Всегда ли числа трехзначные? Если это так, вы можете просто лексикографически отсортировать строки., @Edgar Bonet

Они могут состоять из 2-3 цифр., @MrAeRoZz


2 ответа


0

Вы можете использовать функцию qsort (см. c- библиотечная-функция-для-сортировки).

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

Я бы не советовал использовать строки из-за ограниченного хранилища SRAM Arduino, у вас может слишком быстро закончиться память.

,

2

Как отмечает Мишель Кейзерс, qsort — это стандартная функция сортировки. из библиотеки. Теперь, поскольку ваши числа могут начинаться с двух или три цифры, вы не можете отсортировать их лексикографически, потому что если вы сделал так, чтобы 111 сортировалось раньше 82. Вместо этого я предлагаю:

  • анализировать начало строк как целые числа
  • сравните целые числа
  • если целые числа равны, то сортировать строки лексикографически.

Самый простой способ преобразовать строки в целые числа — использовать atoi(). В отличие от такие функции, как strtol(), atoi() не проверяют ошибки, но достаточно хорошо, если вы точно знаете, что строки имеют правильный формат.

Вот функция сравнения:

int compare(const void *a, const void *b)
{
    // Получить строки.
    const char *sa = *(const char * const *) a;
    const char *sb = *(const char * const *) b;

    // Сначала сравним числовые префиксы.
    int ia = atoi(sa);
    int ib = atoi(sb);
    if (ia < ib) return -1;
    if (ia > ib) return +1;

    // Если равны, сравните строки лексикографически.
    return strcmp(sa, sb);
}

А вот пример того, как его использовать:

#define STR_COUNT 3
const char *strings[STR_COUNT] = { "112:AAAA", "82:FFFF", "111:EEEE" };
qsort(strings, STR_COUNT, sizeof strings[0], compare);

Теперь массив строк отсортирован как ("82:FFFF", "111:EEEE", "112:АААА").

,