strverscmp(3) | Library Functions Manual | strverscmp(3) |
strverscmp - сравнение двух строк версий
Standard C library (libc, -lc)
#define _GNU_SOURCE /* см. feature_test_macros(7) */ #include <string.h>
int strverscmp(const char *s1, const char *s2);
Часто имеются файлы jan1, jan2, ..., jan9, jan10, … и при выводе списка командой ls(1) они выводятся как jan1, jan10, ..., jan2, …, jan9, что несколько не то, что хотелось бы. Чтобы исправить это, в GNU добавлен аргумент командной строки -v команды ls(1), который реализован через функцию versionsort(3), которая, в свою очередь, использует функцию strverscmp().
Таким образом, задача функции strverscmp() в том, чтобы сравнить две строки и найти «правильную» очередность, в то время как strcmp(3) обнаруживает только лексикографический порядок. Эта функция не использует категорию локали LC_COLLATE, что, в общем случае, означает, что строки должны быть в кодировке ASCII.
Функция делает следующее. Если обе строки равны, то возвращается 0. Иначе находится позиция между двумя байтами в обеих строках, до которой строки равны, а после которой не равны. Далее находятся наибольшие последовательные строки цифр, содержащие (или начинающиеся, или заканчивающиеся) эту позицию. Если такие последовательности не найдены в обеих строках, то возвращается такой же результат, какой вернула бы функция strcmp(3) (численная сортировка по значениям байтов). В противном случае обе строки цифр сравниваются численно. При этом строки, начинающиеся с одного или более нулей рассматриваются таким образом, как если бы перед ними стояла десятичная запятая (то есть строки цифр начинающиеся с большего количества нулей, будут идти перед строками с меньшим количеством). Пример: 000, 00, 01, 010, 09, 0, 1, 9, 10.
Функция strverscmp() возвращает целое число меньшее, равное или большее нуля, если, соответственно, s1 должно идти раньше, на том же месте, или позже s2.
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
strverscmp() | Безвредность в нитях | MT-Safe |
Эта функция является расширением GNU.
Показанная далее программа демонстрирует поведение strverscmp(). Функция strverscmp() используется для сравнения двух строк, заданных в аргументах командной строки. Пример работы:
$ ./a.out jan1 jan10 jan1 < jan10
#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int res; if (argc != 3) { fprintf(stderr, "Usage: %s <string1> <string2>\n", argv[0]); exit(EXIT_FAILURE); } res = strverscmp(argv[1], argv[2]); printf("%s %s %s\n", argv[1], (res < 0) ? "<" : (res == 0) ? "==" : ">", argv[2]); exit(EXIT_SUCCESS); }
rename(1), strcasecmp(3), strcmp(3), strcoll(3)
Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 декабря 2022 г. | Linux man-pages 6.03 |