Как отсортировать строку с числом по возрастанию
Мне трудно понять, как сортировать строку, в которой есть число.
Строка, которую я отправляю, выглядит как 112:AAAA и 111:EEEE, как мне ее отсортировать, чтобы 111 была первой в массиве, но (и вот что я не могу понять) отсортированный массив должен содержать буквы снова, так что это будет массив строк, отсортированный по номерам и имеющий вид 111:EEEE, 112:AAAA.
Я хотел использовать то, что я видел на C#, имея ключ и значение, но, похоже, этого не существует в коде arduino. Поэтому я импровизировал, записав все в массив из 1 символа.
изменить: я вижу, что смешиваю массив символов и строку, я очень гибкий, и его не проблема изменить на 1 или другой, в настоящее время я использую массивы символов.
Думаю, было бы достаточно просто отсортировать строки, но я не могу найти функцию и для этого.
@MrAeRoZz, 👍1
Обсуждение2 ответа
Вы можете использовать функцию qsort
(см. c- библиотечная-функция-для-сортировки).
С помощью определяемой пользователем функции comp
вы можете получить первые два или три символа, преобразовать их в целое число и сравнить с преобразованным целым числом из другого элемента.
Я бы не советовал использовать строки из-за ограниченного хранилища SRAM Arduino, у вас может слишком быстро закончиться память.
Как отмечает Мишель Кейзерс, 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:АААА").
- Ничего не получено от функции, возвращающей массив строк
- Преобразование строки в IP-адрес
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- Как добавить в массив из String в ардуино?
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Как исправить код утечки памяти в ESP8266/NodeMCU, вызванный концентрацией строк?
- strcmp, похоже, не работает
- Как заменить объекты String массивами символов, продолжая использовать строковые методы
Всегда ли числа трехзначные? Если это так, вы можете просто лексикографически отсортировать строки., @Edgar Bonet
Они могут состоять из 2-3 цифр., @MrAeRoZz