title: stdio_ext(3)

summary: интерфейс к структуре

text:
# stdio_ext(3)

## ИМЯ
__fbufsize, __flbf, __fpending, __fpurge, __freadable, __freading, __fsetlocking, __fwritable, __fwriting, _flushlbf - интерфейс к структуре stdio FILE

## ОБЗОР

```
#include <stdio.h>
#include <stdio_ext.h>
```

```
size_t __fbufsize(FILE *stream);
size_t __fpending(FILE *stream);
int __flbf(FILE *stream);
int __freadable(FILE *stream);
int __fwritable(FILE *stream);
int __freading(FILE *stream);
int __fwriting(FILE *stream);
int __fsetlocking(FILE *stream, int type);
void _flushlbf(void);
void __fpurge(FILE *stream);
```

## ОПИСАНИЕ
В Solaris были представлены процедуры, представляющие переносимый способ доступа к внутренностям структуры FILE, в glibc они также реализованы.

Функция __fbufsize() возвращает размер буфера, использующегося в данным момент указанным потоком.

Функция __fpending() возвращает количество байт в буфере вывода. В потоках с широкими символами единицей является широкий символ. Эта функция не определена для буферов, находящихся в процессе чтения, или открытых в режиме только для чтения.

Функция __flbf() возвращает ненулевое значение, если поток буферизируется построчно, и ноль в противном случае.

Функция __freadable() возвращает ненулевое значение, если поток доступен для чтения, и ноль в противном случае.

Функция __fwritable() возвращает ненулевое значение, если поток доступен для записи, и ноль в противном случае.

Функция __freading() возвращает ненулевое значение, если поток доступен только для чтения, или если последняя операция с потоком была операцией чтения, и ноль в противном случае.

Функция __fwriting() возвращает ненулевое значение, если поток доступен только для записи (или открыт только для добавления), или если последняя операция с потоком была операцией записи, и ноль в противном случае.

Функция __fsetlocking() может быть использована для выбора желаемого типа блокировки потока. Она возвращает текущий тип. В аргументе type может быть указано одно из трёх значений:

FSETLOCKING_INTERNAL

Выполнять неявную блокировку при каждой операции с заданным потоком (за исключением *_unlocked). Действует по умолчанию.

FSETLOCKING_BYCALLER

Вызывающий сам выполняет блокировку (возможно, с помощью flockfile(3), если есть несколько нитей), и процедуры stdio не выполняют блокировки до тех пор, пока состояние не сбросится в FSETLOCKING_INTERNAL.

FSETLOCKING_QUERY

Не изменять тип блокировки (только вернуть текущий).

Функция _flushlbf() сбрасывает (flushes) все буферизируемые построчно потоки (например для того, чтобы вывести всё на терминал перед чтением ввода с клавиатуры).

Функция __fpurge() удаляет содержимое поточного буфера.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

__fbufsize(), __fpending(), __fpurge(), __fsetlocking()

Безвредность в нитях

MT-Safe race:stream

__flbf(), __freadable(), __freading(), __fwritable(), __fwriting(), _flushlbf()

Безвредность в нитях

MT-Safe

## СМОТРИТЕ ТАКЖЕ
flockfile(3), fpurge(3)


stpcpy

package: man-pages-ru

title: stpcpy(3)

text:
# stpcpy(3)

## ИМЯ
stpcpy - копирование строки с возвращением указателя на её конец

## ОБЗОР

```
#include <string.h>
```

```
char *stpcpy(char *dest, const char *src);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

stpcpy():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция strcpy() копирует строку, указанную в src, включая завершающий байт null ('\0'), в массив, указанный в dest. Строки не могут перекрываться, а строка назначения dest должна быть достаточно велика, чтобы хранить копию.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция stpcpy() возвращает указатель на конец строки dest (то есть адрес конечного байта null), а не на её начало.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

stpcpy()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция была добавлена в POSIX.1-2008. До этого, она не была частью стандарта C или POSIX.1, или обычной для систем UNIX. Впервые она появилась не раньше 1986 года в компиляторе Lattice C AmigaDOS, затем в GNU fileutils и GNU textutils в 1989 году, и в библиотеке GNU C в 1992 году. Также она есть в разных BSD.

## ДЕФЕКТЫ
Эта функция может переполнить буфер dest.

## ПРИМЕР
Данная программа использует stpcpy() для объединения foo и bar, чтобы получить строку foobar, которая затем выводится.

```
#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
int
main(void)
{

    char buffer[20];

    char *to = buffer;

    to = stpcpy(to, "foo");

    to = stpcpy(to, "bar");

    printf("%s\n", buffer);
}
```

## СМОТРИТЕ ТАКЖЕ
bcopy(3), memccpy(3), memcpy(3), memmove(3), stpncpy(3), strcpy(3), string(3), wcpcpy(3)


stpncpy

title: stpncpy(3)

text:
# stpncpy(3)

## ИМЯ
stpncpy - копирование строки фиксированной длины с возвращением указателя на её конец

## ОБЗОР

```
#include <string.h>
```

```
char *stpncpy(char *dest, const char *src, size_t n);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

stpncpy():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция stpncpy() копирует не более n символов из строки, на которую ссылается указатель src, включая конечный байт null ('\0'), в массив по указателю dest. В dest будет записано точно n символов. Если длина strlen(src) меньше n, то оставшиеся символы в массиве dest будут заполнены байтами null ('\'). Если длина strlen(src) больше или равна n, то строка, на которую ссылается указатель dest, не будет завершаться null.

Строки не должны пересекаться.

Программист должен быть уверен, что в dest достаточно места для по крайней мере n символов.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
stpncpy() возвращает указатель на завершающий байт null в dest или, если dest не завершается null, dest+n.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

stpncpy()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Эта функция была добавлена в POSIX.1-2008. До этого она считалась расширением GNU. Впервые она появилась в версии 1.07 библиотеки GNU C в 1993 году.

## СМОТРИТЕ ТАКЖЕ
strncpy(3), wcpncpy(3)


strcasecmp

title: strcasecmp(3)

summary: сравнение двух строк без учёта регистра

text:
# strcasecmp(3)

## ИМЯ
strcasecmp, strncasecmp - сравнение двух строк без учёта регистра

## ОБЗОР

```
#include <strings.h>
```

```
int strcasecmp(const char *s1, const char *s2);
```

```
int strncasecmp(const char *s1, const char *s2, size_t n);
```

## ОПИСАНИЕ
Функция strcasecmp() выполняет побайтовое сравнение строк s1 и s2, игнорируя регистр символов. Она возвращает целое число, которое меньше, равно или больше нуля, если выяснится, что s1 меньше, равна или больше s2 соответственно.

Функция strncasecmp() работает аналогичным образом, но сравниваются не более n байт строк s1 и s2.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strcasecmp() и strncasecmp() возвращают целое число, которое меньше, больше нуля или равно ему, если s1, без учёта регистра, соответственно меньше, больше или равна s2.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strcasecmp(), strncasecmp()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.4BSD, POSIX.1-2001, POSIX.1-2008.

## ЗАМЕЧАНИЯ
Впервые, функции strcasecmp() и strncasecmp() появились в 4.4BSD, где они объявлялись в <string.h>. Из-за этого, по причине исторической совместимости, в заголовочном файле glibc <string.h> также объявлены эти функции, если определён макрос тестирования свойств _DEFAULT_SOURCE (или, в glibc 2.19 и старее, _BSD_SOURCE).

В стандарте POSIX.1-2008 об этих функциях сказано:

Если используется категория локали LC_CTYPE из локали POSIX, то эти функции должны работать как если бы строки были преобразованы к нижнему регистру и проводилось побайтовое сравнение. В противном случае результаты не определёны.

## СМОТРИТЕ ТАКЖЕ
bcmp(3), memcmp(3), strcmp(3), strcoll(3), string(3), strncmp(3), wcscasecmp(3), wcsncasecmp(3)


strcat

title: strcat(3)

summary: объединяет две строки

text:
# strcat(3)

## ИМЯ
strcat, strncat - объединяет две строки

## ОБЗОР

```
#include <string.h>
```

```
char *strcat(char *dest, const char *src);
```

```
char *strncat(char *dest, const char *src, size_t n);
```

## ОПИСАНИЕ
Функция strcat() добавляет строку src к строке dest, перезаписывая байт null ('\0') в конце dest и добавляет завершающий байт null. Строки не могут перекрываться, а в строке dest должно хватать свободного места для размещения объединённой строки. Если размер dest мал, то поведение программы непредсказуемо; переполнение буфера — любимое средство для атаки защищённых программ.

Функция strncat() работает аналогичным образом, но

- задействует не более n первых байт строки src и

- строка src может не завершаться байтом null, если в ней содержится n или более байт.

Как и strcat(), строка-результат в dest всегда заканчивается байтом null.

Если в src содержится n или более байт, то strncat() записывает n+1 байт в dest (n из src плюс завершающий байт null). Поэтому размер dest должен быть не менее strlen(dest)+n+1.

Простейшей реализацией strncat() может быть:

```
char *
strncat(char *dest, const char *src, size_t n)
{

    size_t dest_len = strlen(dest);

    size_t i;

    for (i = 0 ; i < n && src[i] != '\0' ; i++)

        dest[dest_len + i] = src[i];

    dest[dest_len + i] = '\0';

    return dest;
}
```

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strcat() и strncat() возвращают указатель на скопированную строку dest.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strcat(), strncat()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## ЗАМЕЧАНИЯ
В некоторых системах (BSD, Solaris и других) есть следующая функция:

size_t strlcat(char *dest, const char *src, size_t size);

Эта функция добавляет строку src, оканчивающуюся null, к строке dest, копируя не более size-strlen(dest)-1 байт из src, и добавляет к результату конечный байт null, если size менее strlen(dest). Эта функция исправляет проблему с переполнением буфера в strcat(), но вызывающий по прежнему должен рассматривать возможность потери данных, если size слишком мал. Функция возвращает длину строки, которую strlcat() пыталась создать; если возвращаемое значение больше или равно size, то произошла потеря данных. Если потеря данных критична, то вызывающий должен или проверять аргументы перед вызовом, или проверять возвращаемое функцией значение. Функция strlcat() отсутствует в glibc и не стандартизована POSIX, но доступна в Linux в библиотеке libbsd.

## ПРИМЕР
Так как strcat() и strncat() должны найти байт null, завершающий строку dest, начиная поиск от начала строки, время выполнения этих функций пропорционально длине строки dest. Это можно увидеть из запуска программы, представленной ниже (если целью является склейка несколько строк в одну, то ручное копирование байт из одного источника и управление концом строки назначения будет более производительным).

### Исходный код программы

```
#include <string.h>
#include <time.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
#define LIM 4000000

    int j;

    char p[LIM + 1];    /* +1 для конечного байта null */

    time_t base;

    base = time(NULL);

    p[0] = '\0';

    for (j = 0; j < LIM; j++) {

        if ((j % 10000) == 0)

            printf("%d %ld\n", j, (long) (time(NULL) - base));

        strcat(p, "a");

    }
}
```

## СМОТРИТЕ ТАКЖЕ
bcopy(3), memccpy(3), memcpy(3), strcpy(3), string(3), strncpy(3), wcscat(3), wcsncat(3)


strchr

title: strchr(3)

text:
# strchr(3)

## ИМЯ
strchr, strrchr, strchrnul - определение местонахождения символа в строке

## ОБЗОР

```
#include <string.h>
```

```
char *strchr(const char *s, int c);
```

```
char *strrchr(const char *s, int c);
#define _GNU_SOURCE         /* см. feature_test_macros(7) */
#include <string.h>
```

```
char *strchrnul(const char *s, int c);
```

## ОПИСАНИЕ
Функция strchr() возвращает указатель на местонахождение первого совпадения с символом c в строке s.

Функция strrchr() возвращает указатель на местонахождение последнего совпадения с символом c в строке s.

Функция strchrnul() подобна strchr(), за исключением того, что если символ c не найден в строке s, то возвращается указатель на байт null в конце s, а не NULL.

Здесь под «символом» подразумевается «байт» — данные функции не работают с широкими и многобайтными символами.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strchr() и strrchr() возвращает указатель на местонахождение первого совпадения с символом или NULL, если символ не найден. Завершающий байт null считается частью строки, и поэтому, если символ c задан как '\0', то эти функции возвращают указатель на завершающий символ.

Функция strchrnul() возвращает указатель на совпавший символ, или указатель на байт null в конце строки s (т.е., s+strlen(s)), если символ не найден.

## ВЕРСИИ
Функция strchrnul() впервые появилась в glibc версии 2.1.1.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strchr(), strrchr(), strchrnul()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
strchr(), strrchr(): POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

Функция strchrnul() является расширением GNU.

## СМОТРИТЕ ТАКЖЕ
index(3), memchr(3), rindex(3), string(3), strlen(3), strpbrk(3), strsep(3), strspn(3), strstr(3), strtok(3), wcschr(3), wcsrchr(3)


strcmp

title: strcmp(3)

summary: сравнивает две строки

text:
# strcmp(3)

## ИМЯ
strcmp, strncmp - сравнивает две строки

## ОБЗОР

```
#include <string.h>
```

```
int strcmp(const char *s1, const char *s2);
```

```
int strncmp(const char *s1, const char *s2, size_t n);
```

## ОПИСАНИЕ
Функция strcmp() сравнивает строки s1 и s2. При этом локаль не учитывается (для её учёта используйте функцию strcoll(3)). Она возвращает целое число, которое меньше, больше нуля или равно ему, если выяснится, что s1 меньше, равна или больше s2 соответственно.

Функция strncmp() работает аналогичным образом, но сравниваются только первые (не более) n байт строки s1 и s2.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strcmp() и strncmp() возвращают целое число, которое меньше, больше нуля или равно ему, если строка s1 (или её первые n байтов) соответственно меньше, больше или равна s2.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strcmp(), strncmp()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
bcmp(3), memcmp(3), strcasecmp(3), strcoll(3), string(3), strncasecmp(3), strverscmp(3), wcscmp(3), wcsncmp(3)


strcoll

title: strcoll(3)

text:
# strcoll(3)

## ИМЯ
strcoll - сравнение двух строк применяя правила текущей локали

## ОБЗОР

```
#include <string.h>
```

```
int strcoll(const char *s1, const char *s2);
```

## ОПИСАНИЕ
Функция strcoll() сравнивает строки s1 и s2. Она возвращает целое число, которое может быть меньше, равно или больше ноля, если выяснится, что s1 меньше, равна или больше s2 соответственно. Сравнение производится на основе правил текущей локали, указанной в категории LC_COLLATE (см. setlocale(3)).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strcoll() возвращает целое число меньше, равное или большее нуля, если выяснится, что s1 меньше, равна или больше s2 соответственно. При этом сравнение строк производится по правилам текущей локали.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strcoll()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## ЗАМЕЧАНИЯ
Если локаль равна POSIX или C, то работа функции strcoll() эквивалентна strcmp(3).

## СМОТРИТЕ ТАКЖЕ
bcmp(3), memcmp(3), setlocale(3), strcasecmp(3), strcmp(3), string(3), strxfrm(3)


strcpy

title: strcpy(3)

summary: копирование строки

text:
# strcpy(3)

## ИМЯ
strcpy, strncpy - копирование строки

## ОБЗОР

```
#include <string.h>
```

```
char *strcpy(char *dest, const char *src);
```

```
char *strncpy(char *dest, const char *src, size_t n);
```

## ОПИСАНИЕ
Функция strcpy() копирует строку (включая завершающий нулевой байт '\0'), указанную в указателе src, в буфер, указанный в указателе dest. Строки не могут пересекаться, а строка в назначении dest должна быть достаточно большой, чтобы принять копию. Берегитесь переполнения буфера (См. ОШИБКИ)!

Функция strncpy() сходна, за исключением того, что скопировано будет только первые n байт из src. Внимание: если в первых n байт из src не окажется нулевого байта, то строка в dest также не будет завершена нулевым байтом.

Если длина src меньше n, strncpy() дописывает в dest нулевые байты, чтобы убедиться, что всего было записано n байт.

Простейшей реализацией strncpy() может быть:

```
char *
strncpy(char *dest, const char *src, size_t n)
{

    size_t i;

    for (i = 0; i < n && src[i] != '\0'; i++)

        dest[i] = src[i];

    for ( ; i < n; i++)

        dest[i] = '\0';

    return dest;
}
```

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strcpy() и strncpy() возвращают указатель на скопированную строку dest.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strcpy(), strncpy()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## ЗАМЕЧАНИЯ
Некоторые программисты считают strncpy() неэффективной и склонной к ошибкам. Если программист точно знает (в том числе с помощью проверок в коде), что размер dest больше src, то strcpy() может быть использована.

Единственным правильным (и предполагаемым) использованием strncpy() является копирование C-строки в буфер фиксированной длины с одновременной проверкой того, что буфер не переполнен и неиспользованные байты в буфере назначения обнулены (для исключения возможной утечки информации в случае, если буфер будет записан на носитель или передан другому процессу через межпроцессовое общение).

Если в первых n байт src не будет завершающего нулевого байта, strncpy() создаст ничем не ограниченную строку в dest. Если размер buf равен buflen, вы можете принудительно завершить строку с помощью следующего кода:

```
if (buflen > 0) {

    strncpy(buf, str, buflen - 1);

    buf[buflen - 1]= '\0';
}
```

Конечно же, вышеприведенный пример не учитывает того, что если размер src больше buflen - 1 байт, при копировании в dest будет потеряна часть информации.

### strlcpy()
В некоторых системах (BSD, Solaris и других) есть следующая функция:

size_t strlcpy(char *dest, const char *src, size_t size);

Эта функция подобна strncpy(), но копирует не более size-1 байт в dest, всегда добавляет конечный байт null и не дополняет назначение (помимо этого) байтами null. В данной функции исправлены некоторые проблемы strcpy() и strncpy(), но вызывающий по-прежнему должен обрабатывать возможность потери данных, если значение size окажется слишком мало. Возвращаемое значение функции — длина src, что позволяет легко обнаружить усечение: если возвращаемое значение больше или равно size, то выполнялось усечение. Если потеря данных неприемлема, то вызывающий должен или проверять аргументы перед вызовом, или проверять возвращаемое значение. Функция strlcpy() отсутствует в glibc и не стандартизована в POSIX, но доступна в Linux из библиотеки libbsd.

## ДЕФЕКТЫ
Если строка назначения strcpy() недостаточно велика, то может случиться всё что угодно. Переполнение буферных строк фиксированной длины является излюбленным методом взломщиков для захвата управления машиной. Каждый раз когда программа читает или копирует данные в буфер, сначала нужно проверять достаточно ли места. Это может необязательным, если вы можете доказать, что переполнение невозможно, но будьте осторожны: со временем программы могут измениться и невозможное станет возможным.

## СМОТРИТЕ ТАКЖЕ
bcopy(3), memccpy(3), memcpy(3), memmove(3), stpcpy(3), stpncpy(3), strdup(3), string(3), wcscpy(3), wcsncpy(3)


strdup

title: strdup(3)

summary: дублирование строки

text:
# strdup(3)

## ИМЯ
strdup, strndup, strdupa, strndupa - дублирование строки

## ОБЗОР

```
#include <string.h>
```

```
char *strdup(const char *s);
```

```
char *strndup(const char *s, size_t n);
char *strdupa(const char *s);
char *strndupa(const char *s, size_t n);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strdup():

_XOPEN_SOURCE >= 500

|| /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

|| /* в версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

strndup():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

strdupa(), strndupa(): _GNU_SOURCE

## ОПИСАНИЕ
Функция strdup() возвращает указатель на новую строку, являющуюся дубликатом строки s. Память под новую строку выделятся с помощью malloc(3) и может быть высвобождены с помощью free(3).

Функция strndup() похожа на предыдущую, но копирует не более n байт. Если s длиннее n, то копируется только n байт и добавляется конечный байт null ('\0').

Функции strdupa() и strndupa() подобны предыдущим, но для выделения буфера используют alloca(3). Эти функции доступны только при использовании GNU GCC и имеют ограничения, описанные в alloca(3).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция strdup() возвращает указатель на копию строки. Она возвращает NULL, если недостаточно памяти и записывает в errno номер ошибки.

## ОШИБКИ
ENOMEM

Недостаточно памяти для размещения копии строки.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strdup(), strndup(), strdupa(), strndupa()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция strdup() соответствует SVr4, 4.3BSD и POSIX.1-2001. strndup() соответствует POSIX.1-2008. strdupa() и strndupa() являются расширениями GNU.

## СМОТРИТЕ ТАКЖЕ
alloca(3), calloc(3), free(3), malloc(3), realloc(3), string(3), wcsdup(3)


strerror

title: strerror(3)

text:
# strerror(3)

## ИМЯ
strerror, strerror_r, strerror_l - возвращают строку описания номера ошибки

## ОБЗОР

```
#include <string.h>
```

```
char *strerror(int errnum);
```

```
int strerror_r(int errnum, char *buf, size_t buflen);

            /* XSI-совместимо */
```

```
char *strerror_r(int errnum, char *buf, size_t buflen);

            /* есть только в GNU */
```

```
char *strerror_l(int errnum, locale_t locale);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strerror_r():

Совместимая с XSI версия предоставляется если:

(_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE

В противном случае предоставляется версия GNU.

## ОПИСАНИЕ
Функция strerror() возвращает указатель на строку, которая описывает код ошибки, переданный в аргументе errnum, возможно, с помощью части LC_MESSAGES текущей локали для выбора соответствующего языка (например, если errnum равно EINVAL, то возвращается описание «Invalid argument»). Эту строку нельзя изменять в приложении, она может измениться при последующих вызовах strerror() или strerror_l(). Другие библиотечные функции, включая perror(3), не изменяют эту строку.

### strerror_r()
Функция strerror_r() подобна strerror(), но её можно безопасно использовать в нитях. Она доступна в двух версиях: версия, совместимая с XSI, определена в POSIX.1-2001 (доступна в glibc начиная с 2.3.4, но не совместима с POSIX до glibc 2.13) и версия, совместимая с GNU (доступна, начиная с glibc 2.0). Версия, совместимая с XSI, предоставляется при наличии набора макросов тестирования свойств, показанных в ОБЗОРЕ; в противном случае предоставляется версия GNU. Если макросы тестирования свойств не указаны явным образом, то (начиная с glibc 2.4) по умолчанию определяется _POSIX_C_SOURCE со значением 200112L, то есть версия strerror_r() XSI предоставляется по умолчанию.

Совместимая с XSI версия strerror_r() более предпочтительна для переносимых приложений. Она возвращает строку ошибки в предоставляемом пользователем буфере buf длиной buflen.

Специальная GNU-версия strerror_r() возвращает строку, содержащую сообщение об ошибке. Это может быть или указатель на строку, которую функция записывает в buf, или указатель на некую (неизменную) статическую строку (в этом случае buf не используется). Если функция сохраняет строку в buf, то сохраняется не более buflen байт (строка может быть обрезана, если значение buflen слишком мало и errnum неизвестно). В строке всегда содержится конечный байт null ('\0').

### strerror_l()
Функция strerror_l() подобна strerror(), но отражает errnum в локале-зависимое сообщение об ошибке, в зависимости от локали, заданной в locale. Поведение strerror_l() не определено, если значение locale равно специальному объекту локали LC_GLOBAL_LOCALE или некорректному описателю объекта локали.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strerror(), strerror_l() и GNU-версия strerror_r() возвращают соответствующую строку описания ошибки или сообщение «Unknown error nnn», если номер ошибки неизвестен.

При успешном выполнении совместимая с XSI функция strerror_r() возвращает 0. При ошибке возвращается (положительный) номер ошибки (начиная с glibc 2.13), или -1 с изменением errno на соответствующий код ошибки (версии glibc до 2.13).

В POSIX.1-2001 и POSIX.1-2008 требуется, чтобы успешный вызов strerror() или strerror_l() не изменял errno, и отмечается, что так как для указания на ошибку не зарезервировано возвращаемого значения, в приложениях для проверки ошибки нужно инициализировать errno нулём до вызова и проверять errno после вызова.

## ОШИБКИ
EINVAL

Значение errnum не является допустимым номером ошибки.

ERANGE

Предоставлено недостаточно места для сохранения описания ошибки.

## ВЕРСИИ
Функция strerror_l() впервые появилась в glibc 2.6.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strerror()

Безвредность в нитях

MT-Unsafe race:strerror

strerror_r(), strerror_l()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция strerror() определена в POSIX.1-2001, POSIX.1-2008, C89 и C99. Функция strerror_r() определена в POSIX.1-2001 и POSIX.1-2008.

Функция strerror_l() описана в POSIX.1-2008.

Функция GNU strerror_r() является нестандартизованным расширением.

В POSIX.1-2001 разрешено strerror() изменять errno, если при вызове возникла ошибка, но не указано какое значение нужно возвращать в качестве результата функции. В некоторых системах strerror() возвращает NULL, если номер ошибки неизвестен. В других системах strerror() возвращает строку вроде «Error nnn occurred» и записывает в errno значение EINVAL, если номер ошибки неизвестен. В C99 и POSIX.1-2008 требуется, чтобы возвращаемое значение не было равно NULL.

## ЗАМЕЧАНИЯ
В библиотеке GNU C для strerror() используется буфер в 1024 символов. Размер буфера должен быть достаточным для исключения возникновения ошибки ERANGE при вызове strerror_r().

## СМОТРИТЕ ТАКЖЕ
err(3), errno(3), error(3), perror(3), strsignal(3), locale(7)


strfmon

title: strfmon(3)

summary: преобразует денежное значение в строку

text:
# strfmon(3)

## ИМЯ
strfmon, strfmon_l - преобразует денежное значение в строку

## ОБЗОР

```
#include <monetary.h>
```

```
ssize_t strfmon(char *s, size_t max, const char *format,
...);
```

```
ssize_t strfmon_l(char *s, size_t max, locale_t locale,
const char *" format , ...);
```

## ОПИСАНИЕ
Функция strfmon() преобразует заданные денежные суммы в соответствии с текущей локалью и указанным форматом format и помещает результат в символьный массив s размера max.

Функция strfmon_l() производит то же действие, но используется локаль, заданная в locale. Поведение strfmon_l() не определёно, если значение locale равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или описатель объекта локали не корректен.

Обычные символы, заданные в аргументе format, копируются в s без преобразования. Определители преобразования начинаются с символа '%'. Непосредственно за ними может следовать ноль или более флагов:

=f

Однобайтовый символ f используется в качестве числового символа-заполнителя (для выравнивания слева, смотрите ниже). Если символ не указан, то используется символ пробела.

^

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

( или +

Флаг ( указывает на то, что отрицательные суммы должны быть заключены в скобки. Флаг + указывает на то, что наличие знака у суммы должно обрабатываться стандартным способом, то есть зависит от локали, например может быть так, что в результате ничего не указывается для положительных сумм и «-» для отрицательных.

!

Пропустить текущий символ.

-

Выровнять все поля по левому краю. По умолчанию выравнивание по правому краю.

Далее может быть указана ширина поля: строка с десятичным числом, определяющая минимальную ширину поля в байтах. По умолчанию 0. Если результат меньше чем эта ширина, то он дополняется пробелами (слева, если установлен флаг выравнивания по левому краю).

Далее может быть указана ширина целой части числа: символ «#», за которым следует строка с десятичным числом. Если количество цифр слева от символа разделителя меньше, чем ширина целой части, то предоставление дополняется слева числовым символом-заполнителем. Группирующие символы не учитываются при подсчете этой ширины поля.

Далее может быть указана точность десятичной части: символ «.», за которым следует строка с десятичным числом. Перед форматированием сумма будет округлена до указанного числа знаков. По умолчанию, точность задаётся в элементах frac_digits и int_frac_digits текущей локали. Если десятичная точность равна 0, то разделитель целой и дробной части не печатается (символ-разделитель определяется переменной LC_MONETARY и может отличаться от символа определенного в переменной LC_NUMERIC).

И, наконец, определение преобразования может заканчиваться символом преобразования. Существует три символа преобразования:

%

(Если в строку необходимо включить этот символ, то он задаётся как «%%».) Помещает символ '%' в строку-результат.

i

Аргумент типа double преобразуется с использованием локального интернационального формата валюты.

n

Аргумент типа double преобразуется с использованием локального национального формата валюты.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функция strfmon() возвращает количество символов, помещённых в массив s, без учёта конечного байта null, предоставляя строку, включающую конечный байт null. Иначе она устанавливает errno в значение E2BIG, возвращает -1, а содержимое массива не определено.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strfmon()

Безвредность в нитях

MT-Safe locale

strfmon_l()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

## ПРИМЕР
Вызов

```
strfmon(buf, sizeof(buf), "[%^=*#6n] [%=*#6i]",

        1234.567, 1234.567);
```

результат

```
[€ **1234,57] [EUR **1 234,57]
```

с локалью nl_NL. С локалями de_DE, de_CH, en_AU и en_GB:

```
[ **1234,57 €] [ **1.234,57 EUR]
[ Fr. **1234.57] [ CHF **1'234.57]
[ $**1234.57] [ AUD**1,234.57]
[ £**1234.57] [ GBP**1,234.57]
```

## СМОТРИТЕ ТАКЖЕ
duplocale(3), setlocale(3), sprintf(3), locale(7)


strfromd

title: strfromd(3)

text:
# strfromd(3)

## ИМЯ
strfromd, strfromf, strfroml - преобразуют значение с плавающей запятой в строку

## ОБЗОР

```
#include <stdlib.h>
```

```
int strfromd(char *restrict str, size_t n,
             const char *restrict format, double fp);
int strfromf(char *restrict str, size_t n,
             const char *restrict format, float fp);
int strfroml(char *restrict str, size_t n,
             const char *restrict format, long double fp);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strfromd(), strfromf(), strfroml():

__STDC_WANT_IEC_60559_BFP_EXT__

## ОПИСАНИЕ
Данные функции преобразуют значение с плавающей запятой fp в строку символов str в соответствии со строкой формата format. В str записывается не более n символов.

Конечный символ null ('\0') записывается только, если n достаточно велико; в противном случае записываемая строка обрезается до n символов.

Функции strfromd(), strfromf() и strfroml() эквивалентны

```
snprintf(str, n, format, fp);
```

не считая строки format.

### Структура строки формата
Строка format должна начинаться с символа '%'. За ним следует необязательное значение точности, состоящее из символа точки (.) и необязательного десятичного числа. Если число не указано, то используется точность ноль. В конце строка формата должна содержать один из преобразователей: a, A, e, E, f, F, g или G.

Преобразователи применяются в соответствии с типом плавающей запятой, представленным суффиксом функции. В связи с этим, в отличии от snprintf() строка формата не содержит символа модификатора длины. Подробное описание преобразователей смотрите в snprintf(3).

Для значений бесконечности и NaN реализация соответствует стандарту C99:

Если fp равно NaN, +NaN или -NaN и указан преобразователь f (или a, e, g), то выполняется преобразование в «nan», «nan» или «-nan», соответственно. Если указан преобразователь F (или A, E, G), то выполняется преобразование в «NAN» или «-NAN». Если fp равно бесконечности, то она схожим образом преобразуется в [-]inf или [-]INF.

Некорректная строка format вызывает непредсказуемое поведение.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strfromd(), strfromf() и strfroml() возвращают количество символов, которое было бы записано в str, если был n было бы достаточно большим, без учёта конечного символа null. То есть если было возвращено значение n или больше, то это указывает на то, что результат был обрезан.

## ВЕРСИИ
Функции strfromd(), strfromf() и strfroml() доступны в glibc начиная с версии 2.25.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7) и разделе POSIX Safety Concepts руководства библиотеки GNU C.

Интерфейс

Атрибут

Значение

strfromd(), strfromf(), strfroml()

Безвредность в нитях

MT-Safe locale

Безопасность в асинхронных сигналах

AS-Unsafe heap

Безопасность в асинхронной отмене

AC-Unsafe mem

Замечание: эти атрибуты только предварительны.

## СООТВЕТСТВИЕ СТАНДАРТАМ
C99, ISO/IEC TS 18661-1.

## ЗАМЕЧАНИЯ
Функции strfromd(), strfromf() и strfroml() учитывают категорию LC_NUMERIC текущей локали.

## ПРИМЕРЫ
Преобразует значение 12.1 с типом float в строку используя десятичное написание, равную «12.100000»:

```
#define __STDC_WANT_IEC_60559_BFP_EXT__
#include <stdlib.h>
int ssize = 10;
char s[ssize];
strfromf(s, ssize, "%f", 12.1);
```

Преобразует значение 12.3456 с типом float в строку используя десятичное написание с двумя цифрами точности, равную «12.35»:

```
#define __STDC_WANT_IEC_60559_BFP_EXT__
#include <stdlib.h>
int ssize = 10;
char s[ssize];
strfromf(s, ssize, "%.2f", 12.3456);
```

Преобразует значение 12.345e19 с типом double в строку используя научное написание с нулевой точностью, равную «1E+20»:

```
#define __STDC_WANT_IEC_60559_BFP_EXT__
#include <stdlib.h>
int ssize = 10;
char s[ssize];
strfromd(s, ssize, "%.E", 12.345e19);
```

## СМОТРИТЕ ТАКЖЕ
atof(3), snprintf(3), strtod(3)


strfry

title: strfry(3)

summary: изменяет строку произвольным образом

text:
# strfry(3)

## ИМЯ
strfry - изменяет строку произвольным образом

## ОБЗОР

```
#define _GNU_SOURCE         /* см. feature_test_macros(7) */
#include <string.h>
```

```
char *strfry(char *string);
```

## ОПИСАНИЕ
Функция strfry() случайным образом переставляет элементы (символы) в строке string. В результате получается анаграмма строки string.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strfry() возвращает указатель на строку-анаграмму.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strfry()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
Функция strfry() есть только в библиотеке GNU C.

## СМОТРИТЕ ТАКЖЕ
memfrob(3), string(3)


strftime

title: strftime(3)

summary: форматирование даты и времени

text:
# strftime(3)

## ИМЯ
strftime - форматирование даты и времени

## ОБЗОР

```
#include <time.h>
```

```
size_t strftime(char *s, size_t max, const char *format,
                const struct tm *tm);
```

## ОПИСАНИЕ
Функция strftime() преобразует время из структуры tm в соответствии с определённым форматом format и помещает результат в символьный массив s размера max. Структура tm определена в <time.h>. Смотрите также ctime(3).

Формат представляет собой строку с null в конце, в которой могут содержаться специальные символьные последовательности, называемые определителями преобразования, каждая из которых состоит из символа '%' и ещё одного символа, называемого символом определителя преобразования. Все остальные символьные последовательности являются обычными символьными последовательностями.

Символы из обычных символьных последовательностей (включая байт null) копируются как есть из format в s. Однако, символы из определителей преобразования заменяются согласно списку, представленному ниже. В этом списке также показаны использованные поля из структуры tm.

%a

Сокращённое название дня недели в зависимости от текущей локали (вычисляется из tm_wday).

%A

Полное название дня недели в зависимости от текущей локали (вычисляется из tm_wday).

%b

Сокращённое название месяца в зависимости от текущей локали (вычисляется из tm_mon).

%B

Полное название месяца в зависимости от текущей локали (вычисляется из tm_mon).

%c

Предпочтительный формат даты и времени для текущей локали.

%C

Век (год/100) как целое двухразрядное число (SU, вычисляется из tm_year).

%d

День месяца в десятичной форме (от 01 до 31) (вычисляется из tm_mday).

%D

Эквивалентно %m/%d/%y (только для американцев, в других странах обычная форма — %d/%m/%y. Это означает, что международный контекст этого формата сомнителен и лучше этот формат не использовать). (SU)

%e

То же, что и %d: десятичное число, обозначающее номер дня месяца, но вместо начального нуля ставится пробел (SU, вычисляется из tm_mday).

%E

Модификатор: использовать другой формат, смотрите далее. (SU)

%F

Эквивалентно %Y-%m-%d (формат даты согласно ISO 8601). (C99)

%G

Год на основе недель с веком в виде десятичного числа, согласно ISO 8601 (смотрите ЗАМЕЧАНИЯ). Год как четырехзначное число, соответствующее номер недели ISO (смотрите %V). Это тот же формат и значение, что и %Y, но если номер недели ISO входит также в прошедший или последующий год, то в этом случае отображается прошедший год (TZ, вычисляется из tm_wday).

%g

То же, что и %G, но без века, то есть двухразрядное число года (00–99) (TZ, вычисляется из tm_wday, tm_yday и tm_wday).

%h

Эквивалентно %b. (SU)

%H

Час как десятичное число в 24-часовых часах (от 00 до 23) (вычисляется из tm_hour).

%I

Час как десятичное число в 12-часовых часах (от 01 до 12) (вычисляется из tm_hour).

%j

День года в десятичной форме (от 001 до 366) (вычисляется из tm_yday).

%k

Час (24-часовые часы) в виде десятичного числа (от 0 до 23); цифры предваряются пробелом (TZ, смотрите также %H, вычисляется из tm_hour).

%l

Час (12-часовые часы) в виде десятичного числа (от 1 до 12); цифры предваряются пробелом (TZ, смотрите также %I, вычисляется из tm_hour).

%m

Месяц в десятичной форме (от 01 до 12) (вычисляется из tm_mon).

%M

Минута в десятичной форме (от 00 до 59) (вычисляется из tm_min).

%n

Символ новой строки. (SU)

%O

Модификатор: использовать другой формат, смотрите далее. (SU)

%p

Или «AM» или «PM», в соответствии со значением времени, или соответствующая строка из текущей локали. Полдень считается как «PM», а полночь как «AM» (вычисляется из tm_hour).

%P

Подобно %p но в нижнем регистре: «am» или «pm» или соответствующая строка из текущей локали (GNU, вычисляется из tm_hour).

%r

Время в формате с a.m. или p.m. notation. В локали POSIX это эквивалентно %I:%M:%S %p. (SU)

%R

Время в 24-часовом формате (%H:%M). (SU) Версия с секундами описана для %T далее.

%s

Количество секунд, которое прошло с начала эпохи, 1970-01-01 00:00:00 +0000 (UTC, TZ, вычисляется из mktime(tm)).

%S

Секунда в виде десятичного числа (от 00 до 60) (диапазон до 60 включительно позволяет учитывать високосные секунды, вычисляется из tm_sec).

%t

Символ табуляции. (SU)

%T

Время в 24-часовом формате (%H:%M:%S). (SU)

%u

День недели в цифровом формате (от 1 до 7), понедельник это 1. Смотрите также %w. (SU, вычисляется из tm_wday).

%U

Номер недели текущего года в виде десятичного числа (от 00 до 53), начиная с первого воскресенья как первого дня недели 01. Смотрите также %V и %W (вычисляется из tm_yday и tm_wday).

%V

Номер недели согласно ISO 8601 (смотрите ЗАМЕЧАНИЯ) в текущем году в виде десятичного числа (от 01 до 53), где неделя 1 это первая неделя, минимум 4 дня которой находятся в новом году. Смотрите также %U и %W (SU, вычисляется из tm_year, tm_yday и tm_wday).

%w

День недели в цифровом формате (от 0 до 6), понедельник это 0. Смотрите также %u (вычисляется из tm_wday).

%W

Номер недели текущего года в виде десятичного числа (от 00 до 53), начиная с первого понедельника как первого дня недели 01 (вычисляется из tm_yday и tm_wday).

%x

Предпочтительный формат даты без времени для текущей локали.

%X

Предпочтительный формат времени без даты для текущей локали.

%y

Год без века в виде десятичного числа (от 00 до 99) (вычисляется из tm_year).

%Y

Год с веком в виде десятичного числа (вычисляется из tm_year).

%z

Числовой часовой пояс +hhmm или -hhmm (то есть смещение часов и минут относительно UTC). (SU)

%Z

Название или сокращение часового пояса.

%+

Дата и время в формате date(1). (TZ) (не поддерживается в glibc2)

%%

Символ '%'.

Некоторые определения преобразования могут быть изменены с помощью указания перед символом определителя преобразования модификатора E или O, который указывает на необходимость использования альтернативного формата. Если альтернативный формат или определение не существует в текущей локали, то поведение будет таким же как если бы проводилось не изменённое преобразование. (SU) В Single UNIX Specification упомянуты %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, где модификатор O означает использование альтернативных численных символов (например, римские цифры), а модификатор E отражает альтернативное представление, зависящее от текущей локали.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Предоставляя строку результата с завершающим байтом null, не превышающую max байт, функция strftime() возвращает количество символов (без учёта конечного байта null), помещённых в массив s. Если длина строки результата (включая завершающий байт null) превысила бы max байт, то strftime() возвращает 0, а содержимое массива будет неопределенным.

Заметим, что возвращаемое значение 0 не всегда означает ошибку. Например, во многих локалях %p представляет собой пустую строку. Пустая строка format считается пустой строкой.

## ОКРУЖЕНИЕ
Используются переменные окружения TZ и LC_TIME.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strftime()

Безвредность в нитях

MT-Safe env locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, C89, C99. Большинство этих определителей поддерживаются стандартом ANSI C (не помечен), Single UNIX Specification (помечен как SU), пакетом часовых поясов Олсона (Olson) (помечен как TZ) и glibc (помечен как GNU), кроме %+, которое не поддерживается в glibc2. С другой стороны, в glibc2 есть несколько дополнительных расширений. В POSIX.1 есть ссылка только на ANSI C; в POSIX.2 описание date(1) содержит несколько расширений, которые можно применить и к strftime(). Преобразование %F есть в C99 и POSIX.1-2001.

В SUSv2 определитель %S позволяет использовать диапазон от 00 до 61, что даёт теоретическую возможность включать в минуту двойную високосную секунду (такой минуты ещё никогда не было).

## ЗАМЕЧАНИЯ

### Учёт недель в ISO 8601
Определители %G, %g и %V заменяются значениями, вычисленными из года на основе недели, который определяется стандартом ISO 8601. В этой системе недели начинаются с понедельника и нумеруются с 01 до 52 или 53. Неделя 1 — это первая неделя, где четыре или более дней находятся в новом году (иначе говоря, неделя 01 это первая неделя года, в которой есть четверг; или неделя с 4 января). Если три или менее дней первой календарной недели выпадают на новый год, то согласно системе счёта недель ISO 8601 эти дни являются частью недели 53 предыдущего года. Например, 1 января 2010 это пятница, то есть только три дня этой календарной недели выпадают на 2010. То есть согласно системе недель ISO 8601 эти три дня являются частью недели 53 (%V) 2009 года (%G); неделя 01 по ISO 8601 для 2010 года начинается с понедельника 4 января 2010 года.

### Замечания по glibc
В glibc есть несколько расширений определений преобразования (эти расширения не входят в POSIX.1-2001, но в некоторых других системах есть подобные возможности). Между символом '%' и символом определителя преобразования может быть указан flag и поле width (и они указываются до модификаторов E или O).

Допускаются следующие символьные флаги:

_

(подчёркивание) Дополнять строку числового результата пробелами.

-

(перенос) Не дополнять строку числового результата.

0

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

^

Преобразовывать алфавитные символы в строке результата в заглавные.

\#

Изменять регистр символов в строке результата на противоположный (этот флаг работает только с некоторыми символами определителей преобразования, и среди них действительно реально полезно только с %Z).

После флага (возможно отсутствующего) может быть указан десятичный определитель ширины. Если реальный размер поля меньше чем эта ширина, то строка результата дополняется (слева) до указанной ширины.

## ДЕФЕКТЫ
Если строка результата превысила бы max байт, значение errno не изменяется. Это делает невозможным отличить данную ошибку от случая, когда для строки format обоснованно создаётся строка результата нулевой длины. В POSIX.1-2001 не определены какие-либо значения errno для strftime().

Некоторые дефектные версии gcc(1) выдают сообщение об использовании %c: warning: `%c' yields only last 2 digits of year in some locales. Естественно, программистам предлагается использовать %c, что даёт предпочтительное представление даты и времени. Каждый, кто встречает подобного вида странные путаницы, обходит эту проблему gcc(1). Относительно понятный способ — это добавить промежуточную функцию

```
size_t
my_strftime(char *s, size_t max, const char *fmt,

            const struct tm *tm)
{

    return strftime(s, max, fmt, tm);
}
```

В настоящее время, у gcc(1) есть параметр -Wno-format-y2k, который отключает предупреждение, поэтому такой способ решения больше не нужен.

## ПРИМЕР
Формат даты согласно RFC 2822 (в английской локали с %a и %b)

"%a, %d %b %Y %T %z"

Формат даты согласно RFC 822 (в английской локали с %a и %b)

"%a, %d %b %y %T %z"

### Пример программы
Представленную ниже программу можно использовать для экспериментов с strftime().

Несколько примеров строк результата, созданных strftime() в реализации glibc:

```
$ ./a.out '%m'
Строка результата: "11"
$ ./a.out '%5m'
Строка результата: "00011"
$ ./a.out '%_5m'
Строка результата: "   11"
```

### Исходный код программы

```
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{

    char outstr[200];

    time_t t;

    struct tm *tmp;

    t = time(NULL);

    tmp = localtime(&t);

    if (tmp == NULL) {

        perror("localtime");

        exit(EXIT_FAILURE);

    }

    if (strftime(outstr, sizeof(outstr), argv[1], tmp) == 0) {

        fprintf(stderr, "strftime вернула 0");

        exit(EXIT_FAILURE);

    }

    printf("Строка результата: \"%s\"\n", outstr);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
date(1), time(2), ctime(3), setlocale(3), sprintf(3), strptime(3)


string

title: string(3)

summary: операции

text:
# string(3)

## ИМЯ
stpcpy, strcasecmp, strcat, strchr, strcmp, strcoll, strcpy, strcspn, strdup, strfry, strlen, strncat, strncmp, strncpy, strncasecmp, strpbrk, strrchr, strsep, strspn, strstr, strtok, strxfrm, index, rindex - операции со строками

## ОБЗОР
\#include <strings.h>

int strcasecmp(const char *s1, const char *s2);

Сравнение строк s1 и s2 без учета регистра.

int strncasecmp(const char *s1, const char *s2, size_t n);

Сравнивает первые n байт строк s1 и s2 без учета регистра.

char *index(const char *s, int c);

Возвращает указатель на местонахождение первого совпадения с символом c в строке s.

char *rindex(const char *s, int c);

Возвращает указатель на местонахождение последнего совпадения с символом c в строке s.

\#include <string.h>

char *stpcpy(char *dest, const char *src);

Копирует строку из src в dest, возвращая указатель на конец строки результата в dest.

char *strcat(char *dest, const char *src);

Добавляет строку src к строке dest, возвращая указатель на dest.

char *strchr(const char *s, int c);

Возвращает указатель на местонахождение первого совпадения с символом c в строке s.

int strcmp(const char *s1, const char *s2);

Сравнивает строки s1 и s2.

int strcoll(const char *s1, const char *s2);

Сравнивает строки s1 и s2, применяя правила текущей локали.

char *strcpy(char *dest, const char *src);

Копирует строку src в dest, возвращая указатель на начало строки в dest.

size_t strcspn(const char *s, const char *reject);

Вычисляет длину начального сегмента строки s, состоящего только из байт, не указанных в строке reject,

char *strdup(const char *s);

Возвращает копию строки s, память для которой выделяется с помощью malloc(3).

char *strfry(char *string);

Переставляет символы в string в произвольном порядке.

size_t strlen(const char *s);

Возвращает длину строки s.

char *strncat(char *dest, const char *src, size_t n);

Добавляет не более n байт из строки src в строку dest, возвращая указатель на dest.

int strncmp(const char *s1, const char *s2, size_t n);

Сравнивает не более n байт строк s1 и s2.

char *strncpy(char *dest, const char *src, size_t n);

Копирует не более n байт из строки src в строку dest, возвращая указатель на dest.

char *strpbrk(const char *s, const char *accept);

Возвращает первое появление в строке s любых байтов из строки accept.

char *strrchr(const char *s, int c);

Возвращает указатель на местонахождение последнего совпадения с символом c в строке s.

char *strsep(char **stringp, const char *delim);

Извлекает начальный токен из stringp, который отделён одним из байтов из delim.

size_t strspn(const char *s, const char *accept);

Вычисляет длину начального сегмента из строки s, состоящего только из байт, указанных в accept.

char *strstr(const char *haystack, const char *needle);

Ищет первое соответствие подстроки needle в строке haystack и возвращает указатель на найденную подстроку.

char *strtok(char *s, const char *delim);

Извлекает токены из строки s, которые отделены одним из байтов из delim.

size_t strxfrm(char *dest, const char *src, size_t n);

Преобразует src в текущую локаль и копирует первые n байт в dest.

## ОПИСАНИЕ
Строковые функции работают со строками, заканчивающимися null. Подробное описание функций смотрите в соответствующей справочной странице.

## СМОТРИТЕ ТАКЖЕ
index(3), rindex(3), stpcpy(3), strcasecmp(3), strcat(3), strchr(3), strcmp(3), strcoll(3), strcpy(3), strcspn(3), strdup(3), strfry(3), strlen(3), strncasecmp(3), strncat(3), strncmp(3), strncpy(3), strpbrk(3), strrchr(3), strsep(3), strspn(3), strstr(3), strtok(3), strxfrm(3)


strlen

title: strlen(3)

summary: вычисление длины строки

text:
# strlen(3)

## ИМЯ
strlen - вычисление длины строки

## ОБЗОР

```
#include <string.h>
```

```
size_t strlen(const char *s);
```

## ОПИСАНИЕ
Функция strlen() подсчитывает длину строки, на которую указывает s, без учета завершающего байта null ('\0').

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strlen() возвращает количество байт в строке, на которую указывает s.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strlen()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, C11, SVr4, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
string(3), strnlen(3), wcslen(3), wcsnlen(3)


strnlen

title: strnlen(3)

text:
# strnlen(3)

## ИМЯ
strnlen - вычисление длины строки постоянного размера

## ОБЗОР

```
#include <string.h>
```

```
size_t strnlen(const char *s, size_t maxlen);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strnlen():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция strnlen() возвращает количество байт в строке, на которую указывает s, не считая завершающего байта null ('\0'), но не более maxlen. При этом strnlen() обращается только к первым maxlen символам, на которые указывает s, и никогда не выходит дальше s+maxlen.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strnlen() возвращает strlen(s), если оно меньше maxlen, или maxlen, если среди первых maxlen байт, на которую указывает s, не встретился завершающий байт null ('\0').

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strnlen()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2008.

## СМОТРИТЕ ТАКЖЕ
strlen(3)


strpbrk

title: strpbrk(3)

text:
# strpbrk(3)

## ИМЯ
strpbrk - ищет в строке любой символ из набора байтов

## ОБЗОР

```
#include <string.h>
```

```
char *strpbrk(const char *s, const char *accept);
```

## ОПИСАНИЕ
Функция strpbrk() ищет первое появление в строке s любых байтов из строки accept.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strpbrk() возвращает указатель на байт в s, который совпадает с одним из байтов в accept, или NULL, если такой байт не найден.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strpbrk()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
index(3), memchr(3), rindex(3), strchr(3), string(3), strsep(3), strspn(3), strstr(3), strtok(3), wcspbrk(3)


strptime

title: strptime(3)

text:
# strptime(3)

## ИМЯ
strptime - преобразование строкового представления времени в структуру времени tm

## ОБЗОР
\#define _XOPEN_SOURCE /* См. feature_test_macros(7) */

\#include <time.h>

char *strptime(const char *s, const char *format, struct tm *tm);

## ОПИСАНИЕ
Функция strptime() является конвертирующей функцией, дополняющей strftime(3): она преобразует символьную строку, на которую указывает s, сохраняя значения в структуре tm (описывает время в виде компонент, broken-down time) согласно формата, заданного в format.

структура времени tm в виде компонент определена в <time.h>:

```
struct tm {

    int tm_sec;    /* секунды (0-60) */

    int tm_min;    /* минуты (0-59) */

    int tm_hour;   /* часы (0-23) */

    int tm_mday;   /* день месяца (1-31) */

    int tm_mon;    /* месяц (0-11) */

    int tm_year;   /* год - 1900 */

    int tm_wday;   /* день недели (0-6, воскресенье = 0) */

    int tm_yday;   /* день года (0-365, 1 января = 0) */

    int tm_isdst;  /* летнее время */
};
```

Дополнительную информацию о структуре tm смотрите в ctime(3).

Аргумент format является символьной строкой, состоящей из описателей поля и текстовых символов, напоминающей scanf(3). Каждый описатель поля состоит из символа % с последующим символом, который указывает на замену описателя поля. Остальные символы в строке format должны совпадать со строкой входных данных. Исключениями являются пробелы, которые совпадают с любым количеством пробелов в строке входных данных. Между любыми двумя описателями полей должно быть пустое место (пробелы) или другие алфавитно-цифровые символы.

Функция strptime() обрабатывает строку ввода слева направо. Каждый из трёх возможных входных элементов (пробел, буква или форматирующие символы) обрабатываются один за другим. Если ввод не соответствует строке форматирования, то функция прекращает работу. Оставшиеся части формата и данных не обрабатываются.

Ниже приведён список поддерживаемых описателей полей. В случае поиска текстовой строки (например, день недели или месяц), сравнение происходит вне зависимости от регистра символов. В случае с цифрами допустимы начальные нули.

%%

Символ %.

%a или %A

Название дня недели согласно текущей локали, в форме аббревиатуры или полного имени.

%b, %B или %h

Название месяца согласно текущей локали, в форме аббревиатуры или полного имени.

%c

Дата и время, отображенные согласно текущей локали.

%C

Номер столетия (0–99).

%d или %e

День месяца (1–31).

%D

Эквивалент %m/%d/%y (американское представление даты, которое может запутать не американцев, особенно с учетом того, что %d/%m/%y широко используется в Европе. Форматом ISO 8601 является %Y-%m-%d).

%H

Час (0–23).

%I

Час на 2-часовом циферблате (1–12).

%j

Номер дня в году (1–366).

%m

Номер месяца (1–12).

%M

Минута (0–59).

%n

Обязательный пробел.

%p

Локализованный эквивалент AM или PM (примечание: его может не быть).

%r

Время по 12-ти часовым часам (используя AM или PM локали). В локали POSIX это эквивалентно %I:%M:%S %p. Если t_fmt_ampm пусто в поле LC_TIME текущей локали, то поведение не определено.

%R

Эквивалент %H:%M.

%S

Секунда (0–60; 60 может появляться для високосных секунд; ранее также допускалось появление 61).

%t

Обязательный пробел.

%T

Эквивалент %H:%M:%S.

%U

Номер недели в году, начинающейся с воскресенья ((0–53). Первое воскресенье января является первым днем недели 1.

%w

Порядковый номер дня недели (0–6), воскресенье = 0.

%W

Номер недели в году, начинающейся с понедельника (0–53). Первый понедельник января является первым днем недели 1.

%x

Дата в локализованном формате представления.

%X

Время в локализованном формате представления.

%y

Год века (0–99). Если век никак не указывается, то года 69–99 относятся к двадцатому веку (1969–1999), а года в диапазоне 00–68 относятся к двадцать первому веку (2000–2068).

%Y

Год, включая столетие (например, 1991).

Некоторые описатели полей могут быть изменены модификаторами E или O, указывающими, что нужно использовать альтернативный формат или спецификацию. Если альтернативный формат или спецификация не существует в текущей локали, то используются неизменённые описатели полей.

Модификатор E указывает на то, что строка ввода может содержать альтернативные локале-зависимые версии представления даты и времени:

%Ec

Альтернативный формат представления даты и времени в текущей локали.

%EC

Альтернативный формат представления базового года в зависимости от текущей локали.

%Ex

Альтернативный формат представления даты в зависимости от текущей локали.

%EX

Альтернативный формат представления времени в зависимости от текущей локали.

%Ey

Альтернативный формат представления смещения от %EC в зависимости от текущей локали.

%EY

Альтернативный формат полного представления года.

Модификатор O указывает, что числовой ввод может производиться в альтернативном формате в зависимости от текущей локали:

%Od или %Oe

Число месяца с использованием альтернативных чисел локали; предшествующие нули можно ставить, но это необязательно.

%OH

Часы (0-24) с использованием альтернативных чисел локали.

%OI

Часы (1-12) с использованием альтернативных чисел локали.

%Om

Месяц с использованием альтернативных чисел локали.

%OM

Минуты с использованием альтернативных чисел локали.

%OS

Секунды с использованием альтернативных чисел локали.

%OU

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

%Ow

Обычный номер дня недели (воскресенье — нулевой день недели) с использованием альтернативных чисел локали.

%OW

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

%Oy

Год (смещение от %C) с использованием альтернативных чисел локали.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращаемым значением функции является указатель на первый символ, не обработанный вызовом. В случае, когда строка ввода содержит больше символов, чем требуется для строки формата, возвращаемое значение будет указателем на место за последним обработанным символом. В случае, когда вся строка ввода обработана, возвращается указатель на завершающий символ строки null. Если strptime() не может найти все соответствия строке формата, то возникает ошибка и возвращается значение NULL.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strptime()

Безвредность в нитях

MT-Safe env locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SUSv2.

## ЗАМЕЧАНИЯ
В принципе, эта функция не инициализирует tm, а только сохраняет указанные значения. Это означает, что tm должна быть инициализирована до этого вызова. Существует небольшая разница между системами UNIX. Функция из glibc не не изменяет поля, которые не описаны явно, за исключением пересчитываемых полей tm_wday и tm_yday, если изменился один из элементов: день, месяц или год.

В glibc 2.0 спецификатор «y» (год столетия) указывает на год в диапазоне 1950–2049. Начиная с glibc 2.1 этот диапазон равен 1969–2068.

### Замечания по glibc
Для симметрии glibc пытается поддерживать в strptime() тот же формат символов что и в strftime(3) (в большинстве случаев, соответствующие поля анализируются, но поле в tm не изменяется). В результате:

%F

Эквивалентно %Y-%m-%d в формате ISO 8601.

%g

Год, соответствующий номеру недели по ISO, но без номера века (0–99).

%G

Год, соответствующий номеру недели по ISO (например, 1991).

%u

День недели в цифровом формате (1–7, где понедельник — 1).

%V

Номер недели в виде числа (1–53) по стандарту ISO 8601:1988 Если неделя (начинающаяся с понедельника) содержит 1 января и имеет 4 или более дней в новом году, то это первая неделя. Иначе это последняя неделя предыдущего года, а следующая неделя первая.

%z

Часовой пояс согласно спецификациям стандарта RFC-822/ISO 8601.

%Z

Название часового пояса.

Аналогично, учитывая расширения GNU для strftime(3), %k принято считать синонимом %H, а %l — синонимом для %I, и %P синонимом %p. И

%s

Количество секунд с начала эпохи, с 1970-01-01 00:00:00 +0000 (UTC). Если нет поддержки для високосных секунд, то они не учитываются.

В реализации glibc не требуется пустого места (пробелов) между двумя описателями полей.

## ПРИМЕР
Следующий пример демонстрирует использование strptime() и strftime(3).

```
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int
main(void)
{

    struct tm tm;

    char buf[255];

    memset(&tm, 0, sizeof(struct tm));

    strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);

    strftime(buf, sizeof(buf), "%d %b %Y %H:%M", &tm);

    puts(buf);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
time(2), getdate(3), scanf(3), setlocale(3), strftime(3)


strsep

title: strsep(3)

summary: извлечение токена из строки

text:
# strsep(3)

## ИМЯ
strsep - извлечение токена из строки

## ОБЗОР

```
#include <string.h>
```

```
char *strsep(char **stringp, const char *delim);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strsep():

Since glibc 2.19:

_DEFAULT_SOURCE

glibc 2.19 и старее:

_BSD_SOURCE

## ОПИСАНИЕ
Если значение *stringp равно NULL, то функция strsep() возвращает NULL и ничего не делает. В противном случае она ищет первый токен в строке *stringp, который отделён в строке одним байтом из delim. Этот токен завершается символом null ('\0'), который устанавливается на место символа разделителя, а значению *stringp присваивается значение, указывающее на следующий символ после токена. Если разделитель не найден, то токеном считается вся строка *stringp и значению *stringp присваивается NULL.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strsep() возвращает указатель на токен, то есть возвращает исходное значение *stringp.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strsep()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
4.4BSD.

## ЗАМЕЧАНИЯ
Функция strsep() была введена в качестве замены функции strtok(3), потому что последняя не может обрабатывать пустые поля. Тем не менее, функция strtok(3) соответствует C89/C99 и поэтому более переносима.

## ДЕФЕКТЫ
Используйте данную функцию с осторожностью. Учитывайте, что:

- Данная функция изменяет первый аргумент.

- Эта функция не может использоваться со строками-константами.

- Теряется идентичность символа-разделителя.

## СМОТРИТЕ ТАКЖЕ
index(3), memchr(3), rindex(3), strchr(3), string(3), strpbrk(3), strspn(3), strstr(3), strtok(3)


strsignal

title: strsignal(3)

summary: возвращает строку, описывающую сигнал

text:
# strsignal(3)

## ИМЯ
strsignal - возвращает строку, описывающую сигнал

## ОБЗОР

```
#include <string.h>
```

```
char *strsignal(int sig);
```

```
extern const char * const sys_siglist[];
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strsignal():

Начиная с glibc 2.10:

_POSIX_C_SOURCE >= 200809L

До glibc 2.10:

_GNU_SOURCE

## ОПИСАНИЕ
Функция strsignal() возвращает строку, которая описывает номер сигнала, переданный в аргументе sig. Строку можно использовать только до следующего вызова strsignal().

В массиве sys_siglist содержатся строки описаний сигналов, упорядоченные по номеру сигнала. Если возможно, вместо этого массива лучше использовать функцию strsignal().

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strsignal() возвращает соответствующую строку описания, или сообщение о неизвестном сигнале, если указан некорректный номер сигнала. В некоторых системах (но не Linux), может быть возвращён NULL при некорректном номере сигнала.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strsignal()

Безвредность в нитях

MT-Unsafe race:strsignal locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2008. Если в Solaris и BSD.

## СМОТРИТЕ ТАКЖЕ
psignal(3), strerror(3)


strspn

title: strspn(3)

summary: определение длины префикса подстроки

text:
# strspn(3)

## ИМЯ
strspn, strcspn - определение длины префикса подстроки

## ОБЗОР

```
#include <string.h>
```

```
size_t strspn(const char *s, const char *accept);
```

```
size_t strcspn(const char *s, const char *reject);
```

## ОПИСАНИЕ
Функция strspn() вычисляет длину (в байтах) начального сегмента строки s, состоящего только из байт строки accept.

Функция strcspn() вычисляет длину начального сегмента строки s, состоящего только из байт, не указанных в строке reject.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strspn() возвращает количество байт в начальном сегменте s, который составляют байты из accept.

Функция strcspn() возвращает количество байт в начальном сегменте s, состоящем только из символов, не указанных в reject.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strspn(), strcspn()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
index(3), memchr(3), rindex(3), strchr(3), string(3), strpbrk(3), strsep(3), strstr(3), strtok(3), wcscspn(3), wcsspn(3)


strstr

title: strstr(3)

summary: поиск подстроки

text:
# strstr(3)

## ИМЯ
strstr, strcasestr - поиск подстроки

## ОБЗОР

```
#include <string.h>
```

```
char *strstr(const char *haystack, const char *needle);
```

```
#define _GNU_SOURCE         /* см. feature_test_macros(7) */
```

```
#include <string.h>
```

```
char *strcasestr(const char *haystack, const char *needle);
```

## ОПИСАНИЕ
Функция strstr() ищет первое соответствие подстроки needle в строке haystack. Конечные байты null ('\0') не сравниваются.

strcasestr() аналогична strstr(), но при этом игнорируется регистр обеих строк.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Данные функции возвращают указатель на начало найденной подстроки или NULL, если подстрока не найдена.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strstr()

Безвредность в нитях

MT-Safe

strcasestr()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
strstr(): POSIX.1-2001, POSIX.1-2008, C89, C99.

strcasestr() является нестандартизованным расширением.

## СМОТРИТЕ ТАКЖЕ
index(3), memchr(3), memmem(3), rindex(3), strcasecmp(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strtok(3), wcsstr(3)


strtod

title: strtod(3)

text:
# strtod(3)

## ИМЯ
strtod, strtof, strtold - преобразует строку ASCII в число с плавающей точкой

## ОБЗОР
\#include <stdlib.h>

double strtod(const char *nptr, char **endptr);

float strtof(const char *nptr, char **endptr);

long double strtold(const char *nptr, char **endptr);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strtof(), strtold():

_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

## ОПИСАНИЕ
Функции strtod(), strtof() и strtold() преобразуют начальную часть строки, на которую указывает nptr, в числа типа double, float, и long double, соответственно.

Ожидаемый вид строки (её начальная часть) — это начальные пробельные символы (необязательно), распознаваемые функцией isspace(3), возможно знаки плюс ('+') или минус ('-'), а затем либо (а) десятичное число, либо (б) шестнадцатеричное число, либо (в) бесконечность, либо (г) NAN (not-a-number, нечисловое значение).

Десятичное число состоит из не пустой последовательности десятичных цифр от 0 до 9, возможно содержащей символ дробного разделителя (десятичная точка, зависит от настройки локали; обычно это символ точки '.'), возможно с последующей десятичной экспонентой. Десятичная экспонента состоит из символа 'E' или 'e', далее возможен знак плюс или минус, а затем непустая последовательность десятичных цифр, означающая умножение всей начальной части на 10 в указанной степени.

Шестнадцатеричное число состоит из символов «0x» или «0X» с последующей непустой последовательностью из шестнадцатеричных цифр, возможно содержащей символ дробного разделителя, далее может следовать двоичная экспонента. Двоичная экспонента состоит из символа 'P' или 'p', далее, возможно, знака плюс или минус, и непустой последовательности десятичных цифр, обозначающих умножение всего начального числа на 2 в указанной степени. По меньшей мере должен быть указан либо символ дробного разделителя либо двоичная экспонента.

Бесконечность — это либо значение «INF» либо «INFINITY», регистр символов не учитывается.

Нечисловое значение (NAN) — это значение «NAN» (регистр символов не учитывается) возможно сопровождаемое (последовательность n символов), где последовательность n символов, определяет тип нечислового значения в зависимости от текущего представления NAN в системе (смотрите ЗАМЕЧАНИЯ).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции возвращают преобразованное значение, если таковое существует.

Если endptr не равно NULL, то указатель на символ, следующий за последним обработанным символом, сохраняется в место, указываемое endptr.

Если никаких преобразований не производилось, то возвращается ноль, а значение nptr сохраняется в той позиции, на которую ссылается endptr (если endptr не равно null).

Если правильное значение вызвало бы переполнение, то возвращается HUGE_VAL (HUGE_VALF, HUGE_VALL) (в зависимости от знака величины), а ERANGE записывается в переменную errno. Если правильное значение было исчерпанным, то возвращается ноль, а переменной errno присваивается значение ERANGE.

## ОШИБКИ
ERANGE

Величина оказалась слишком большой или очень маленькой.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strtod(), strtof(), strtold()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99.

strtod() была также описана в C89.

## ЗАМЕЧАНИЯ
Так как возвращаемым значением может быть 0 при успешном выполнении и ошибке, вызывающая программа должна присвоить errno значение 0 до вызова, а после вызова определить возникновение ошибки по ненулевому значению errno.

В реализации glibc последовательность n символов, которая может появляться после «NAN», рассматривается как целое число (с необязательным префиксом «0» или «0x» для указания системы счисления 8 или 16), которое будет помещено в мантиссу возвращаемого значения.

## ПРИМЕР
Пример можно найти в справочной странице strtol(3); в ней показано использование похожих функций.

## СМОТРИТЕ ТАКЖЕ
atof(3), atoi(3), atol(3), nan(3), nanf(3), nanl(3), strfromd(3), strtol(3), strtoul(3)


strtoimax

title: strtoimax(3)

summary: преобразует строку в integer

text:
# strtoimax(3)

## ИМЯ
strtoimax, strtoumax - преобразует строку в integer

## ОБЗОР

```
#include <inttypes.h>
```

```
intmax_t strtoimax(const char *nptr, char **endptr, int base);
uintmax_t strtoumax(const char *nptr, char **endptr, int base);
```

## ОПИСАНИЕ
Данные функции подобны strtol(3) и strtoul(3), за исключением того, что возвращают значение типа intmax_t и uintmax_t, соответственно.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается преобразованное значение. Если для преобразования ничего не нашлось, то возвращается ноль. При переполнении или исчерпании возвращается INTMAX_MAX, INTMAX_MIN или UINTMAX_MAX, а в errno записывается ERANGE.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strtoimax(), strtoumax()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C99.

## СМОТРИТЕ ТАКЖЕ
imaxabs(3), imaxdiv(3), strtol(3), strtoul(3), wcstoimax(3)


strtok

title: strtok(3)

text:
# strtok(3)

## ИМЯ
strtok, strtok_r - извлечение элементов (токенов) из строки

## ОБЗОР

```
#include <string.h>
```

```
char *strtok(char *str, const char *delim);
```

```
char *strtok_r(char *str, const char *delim, char **saveptr);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strtok_r(): _POSIX_C_SOURCE

|| /* в версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

## ОПИСАНИЕ
Функция strtok() разделяет строку на последовательность нуля или более непустых токенов. При первом вызове strtok() анализируемую строку нужно указывать в аргументе str. В каждом последующем вызове, в котором анализируется эта же строка, значение str должно быть NULL.

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

Каждый вызов strtok() возвращает указатель на строку, завершающуюся null, которая содержит следующий токен. Эта строка не включает байт-разделитель. Если больше токенов нет, то strtok() возвращает NULL.

Последовательность вызовов strtok(), оперирующих одной строкой, поддерживает указатель, который определяет точку, с которой начинается поиск следующего токена. Первый вызов strtok() назначает этому указателю ссылку на первый байт строки. Начало следующего токена определяется поиском вперёд в str следующего байта не разделителя. Если байт найден, то он берётся в качестве начала следующего токена. Если такой байт не найден, то токенов больше нет и strtok() возвращает NULL (для пустой строки или состоящей только из разделителей в этом случае NULL вернётся при первом вызове strtok()).

Конец каждого токена находится поиском вперёд, длящемся до тех пор, пока не будет найден байт-разделитель или завершающий байт null ('\0'). Если найден байт-разделитель, то он заменяется байтом null для завершения текущего токена, и strtok() сохраняет указатель на следующий байт; этот указатель будет использован в качестве начальной точки при поиске следующего токена. В этом случае strtok() возвращает указатель на начало найденного токена.

Из описания выше следует, что последовательность из двух и более непрерывных байтов-разделителей в просматриваемой строке считается одним разделителем, а байты-разделители в начале или конце строки игнорируются. Другими словами, токены, возвращаемые strtok() — всегда не пустые строки. То есть, например, если есть строка «aaa;;bbb,», то последующие вызовы strtok() с заданными разделителями строк «;,» вернули бы строки «aaa» и «bbb», а затем указатель null.

Функция strtok_r() является реентерабельной версией strtok(). Аргумент saveptr является указателем на переменную char *, которая используется внутри strtok_r() для учёта контекста между последующими вызовами при анализе одной и той же строки.

При первом вызове strtok_r() значение str должно указывать на анализируемую строку, а значение *saveptr игнорируется (но смотрите ЗАМЕЧАНИЯ). При последующих вызовах значение str должно быть NULL, а значение saveptr (и буфер, на который оно указывает) не должно изменяться с момента предыдущего вызова.

Одновременно могут анализироваться разные строки при нескольких запусках strtok_r() с различными аргументами saveptr.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функции strtok() и strtok_r() возвращают указатель на следующий токен или NULL, если больше токенов нет.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strtok()

Безвредность в нитях

MT-Unsafe race:strtok

strtok_r()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
strtok()

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

strtok_r()

POSIX.1-2001, POSIX.1-2008.

## ЗАМЕЧАНИЯ
В некоторых реализациях значение *saveptr должно быть равно NULL при первом вызове strtok_r(), который используется для разбора str.

## ДЕФЕКТЫ
Используйте данные функции с осторожностью. Учитывайте, что:

- Эти функции изменяют свой первый аргумент.

- Эти функции не могут использоваться со строками-константами.

- Теряется идентичность байта-разделителя.

- При анализе функция strtok() использует статический буфер, поэтому не является безопасной для нитей. Используйте strtok_r() в этом случае.

## ПРИМЕР
В программе, представленной далее, используются вложенные циклы, которые вызывают strtok_r() для разделения строки на составляющие её токены. В первом параметре командной строки задаётся анализируемая строка. Во втором параметре задаётся байт(ы)- разделитель, который используется для деления строки на «составные» токены. В третьем параметре указывается байт(ы)- разделитель, который используется для разделения «составных» токенов на подтокены.

Пример результата вывода программы:

```
$ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/'
1: a/bbb///cc

         --> a

         --> bbb

         --> cc
2: xxx

         --> xxx
3: yyy

         --> yyy
```

### Исходный код программы

```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{

    char *str1, *str2, *token, *subtoken;

    char *saveptr1, *saveptr2;

    int j;

    if (argc != 4) {

        fprintf(stderr, "Использование: %s string delim subdelim\n",

                argv[0]);

        exit(EXIT_FAILURE);

    }

    for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {

        token = strtok_r(str1, argv[2], &saveptr1);

        if (token == NULL)

            break;

        printf("%d: %s\n", j, token);

        for (str2 = token; ; str2 = NULL) {

            subtoken = strtok_r(str2, argv[3], &saveptr2);

            if (subtoken == NULL)

                break;

            printf(" --> %s\n", subtoken);

        }

    }

    exit(EXIT_SUCCESS);
}
```

Ещё один пример программы, использующей strtok(), можно найти в getaddrinfo_a(3).

## СМОТРИТЕ ТАКЖЕ
index(3), memchr(3), rindex(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strstr(3), wcstok(3)


strtol

title: strtol(3)

text:
# strtol(3)

## ИМЯ
strtol, strtoll, strtoq - преобразует строку в длинное целое число

## ОБЗОР

```
#include <stdlib.h>
```

```
long int strtol(const char *nptr, char **endptr, int base);
```

```
long long int strtoll(const char *nptr, char **endptr, int base);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strtoll():

_ISOC99_SOURCE

|| /* в версии glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

## ОПИСАНИЕ
Функция strtol() преобразует начальную часть строки nptr в длинное целое число согласно системе счисления base, значение которой может быть от 2 до 36 включительно или равно специальному значению 0.

Строка может начинаться с произвольного количества пробельных символов (определяемых при помощи isspace(3)), затем может быть указан знак «+» или «-». Если base равно 0 или 16, то строка может начинаться с приставки «0x» или «0X», что означает использование шестнадцатеричной системы исчисления; иначе, если base равно нулю, то используется десятичная система счисления (кроме, когда последующий символ также равен «0»: в этом случае используется восьмеричная система исчисления).

Остаток строки преобразуется в число с типом long int. Этот процесс останавливается, если в строке встречается некорректный символ для указанной системе счисления. В системах счисления больших 10, символ «A» в верхнем или нижнем регистре означает 10, «B» означает 11 и так далее до «Z», означающего 35.

Если значение endptr не NULL, то strtol() записывает адрес первого некорректного символа в *endptr. Если в строке вообще нет цифр, то strtoul() сохраняет изначальное значение nptr в *endptr (и возвращает 0). В частности, если *nptr не равно '\0', но **endptr равно '\0' при возврате, то вся строка состоит из корректных символов.

Функция strtoll() работает так же, как и strtol(), но возвращает число с типом long long int.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strtol() возвращает результат преобразования, если значение не возникают переполнения или исчерпания. Если возникает исчерпание, то strtol() возвращает LONG_MIN. Если возникает переполнение, то strtoul() возвращает LONG_MAX. В обоих случаях переменной errno присваивается значение ERANGE. То же самое относится к strtoll(), только вместо LONG_MIN и LONG_MAX возвращается LLONG_MIN и LLONG_MAX.

## ОШИБКИ
EINVAL

(нет в C99) Аргумент base содержит неподдерживаемое значение.

ERANGE

Полученное значение вне диапазона.

Реализация может также устанавливать errno в EINVAL в случае, когда преобразование не было выполнено (не было встречено цифр и возвращён 0).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strtol(), strtoll(), strtoq()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
strtol(): POSIX.1-2001, POSIX.1-2008, C89, C99 SVr4, 4.3BSD.

strtoll(): POSIX.1-2001, POSIX.1-2008, C99.

## ЗАМЕЧАНИЯ
Так как strtol() может обоснованно вернуть 0, LONG_MAX или LONG_MIN (а strtoll() — LLONG_MAX или LLONG_MIN) при успешном выполнении и ошибке, вызывающая программа до вызова должна присвоить errno значение 0, а после вызова определить возникновение ошибки по ненулевому значению errno.

Согласно POSIX.1, в локалях отличных от «C» и «POSIX», эти функции могут преобразовывать другие, определяемые реализацией, строки с числами.

В BSD также есть функция

```
quad_t strtoq(const char *nptr, char **endptr, int base);
```

с полностью аналогичным определением. В зависимости от длины слова в текущей архитектуре, она может быть аналогом strtoll() или strtol().

## ПРИМЕР
Программа, представленная далее, показывает использование strtol(). В первом аргументе командной строки указывается срока, из которой strtol() должна извлечь число. Во втором (необязательном) аргументе указывается система счисления, используемая для преобразования (этот аргумент преобразуется в число с помощью atoi(3), функции, которая не учитывает ошибки и имеет более простой интерфейс по сравнению с strtol()). Вот несколько результатов работы этой программы:

```
$ ./a.out 123
strtol() вернула 123
$ ./a.out '    123'
strtol() вернула 123
$ ./a.out 123abc
strtol() вернула 123
Остальные символы после числа: abc
$ ./a.out 123abc 55
strtol: некорректный аргумент
$ ./a.out ''
Цифры отсутствуют
$ ./a.out 4000000000
strtol: Числовой результат выходит за диапазон
```

### Исходный код программы

```
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <errno.h>
int
main(int argc, char *argv[])
{

    int base;

    char *endptr, *str;

    long val;

    if (argc < 2) {

        fprintf(stderr, "Использование: %s строка [система_счисления]\n", argv[0]);

        exit(EXIT_FAILURE);

    }

    str = argv[1];

    base = (argc > 2) ? atoi(argv[2]) : 10;

    errno = 0;    /* чтобы выявить ошибку после вызова */

    val = strtol(str, &endptr, base);

    /* проверка возможных ошибок */

    if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))

            || (errno != 0 && val == 0)) {

        perror("strtol");

        exit(EXIT_FAILURE);

    }

    if (endptr == str) {

        fprintf(stderr, "Цифры отсутствуют\n");

        exit(EXIT_FAILURE);

    }

    /* если мы дошли сюда, то strtol() успешно преобразовала число */

    printf("strtol() вернула %ld\n", val);

    if (*endptr != '\0')        /* необязательно ошибка… */

        printf("Остальные символы после числа: %s\n", endptr);

    exit(EXIT_SUCCESS);
}
```

## СМОТРИТЕ ТАКЖЕ
atof(3), atoi(3), atol(3), strtod(3), strtoimax(3) strtoul(3),


strtoul

title: strtoul(3)

text:
# strtoul(3)

## ИМЯ
strtoul, strtoull, strtouq - преобразование строки в целое с типом unsigned long integer

## ОБЗОР

```
#include <stdlib.h>
```

```
unsigned long int strtoul(const char *nptr, char **endptr, int base);
```

```
unsigned long long int strtoull(const char *nptr, char **endptr,
                                int base);
```

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

strtoull():

_ISOC99_SOURCE ||

|| /* в версии glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

## ОПИСАНИЕ
Функция strtoul() преобразует начальную часть строки nptr в число с типом unsigned long int согласно системе счисления base, значение которой может быть от 2 до 36 включительно или равно специальному значению 0.

Строка может начинаться с произвольного количества пробельных символов (определяемых при помощи isspace(3)), затем может быть указан знак «+» или «-». Если base равно 0 или 16, то строка может начинаться с приставки «0x», что означает использование шестнадцатеричной системы исчисления; иначе, если base равно нулю, то используется десятичная система счисления (кроме, когда последующий символ также равен «0»: в этом случае используется восьмеричная система исчисления).

Остаток строки преобразуется в число с типом unsigned long int. Этот процесс останавливается, если в строке встречается некорректный символ для указанной системе счисления. В системах счисления больших 10, символ «A» в верхнем или нижнем регистре означает 10, «B» означает 11 и так далее до «Z», означающего 35.

Если значение endptr не NULL, то strtoul() записывает адрес первого некорректного символа в *endptr. Если в строке вообще нет цифр, то strtoul() сохраняет изначальное значение nptr в *endptr (и возвращает 0). В частности, если *nptr не равно '\0', но **endptr равно '\0' при возврате, то вся строка состоит из корректных символов.

Функция strtoull() работает так же, как и strtoul(), но возвращает число с типом unsigned long long int.

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strtoul() возвращает результат преобразования, либо, если был указан знак минуса, возвращается отрицательный результат преобразования, представленный в виде положительного числа, если изначальное (неотрицательное) значение не вызывает переполнения; в этом случае strtoul() возвращает ULONG_MAX, а переменной errno присваивается значение ERANGE. То же самое относится к strtoull(), только вместо ULONG_MAX возвращается ULLONG_MAX.

## ОШИБКИ
EINVAL

(нет в C99) Аргумент base содержит неподдерживаемое значение.

ERANGE

Полученное значение вне диапазона.

Реализация может также устанавливать errno в EINVAL в случае, когда преобразование не было выполнено (не было встречено цифр и возвращён 0).

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strtoul(), strtoull(), strtouq()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
strtoul(): POSIX.1-2001, POSIX.1-2008, C89, C99 SVr4.

strtoull(): POSIX.1-2001, POSIX.1-2008, C99.

## ЗАМЕЧАНИЯ
Так как strtoul() может обоснованно вернуть 0 или ULONG_MAX (ULLONG_MAX для strtoull()) при успешном выполнении и ошибке, вызывающая программа до вызова должна присвоить errno значение 0, а после вызова определить возникновение ошибки по ненулевому значению errno.

При помощи локалей могут приниматься строки, отличные от допустимых в локали «C» (например, может поддерживаться разделитель тысяч из текущей локали).

В BSD также есть функция

```
u_quad_t strtouq(const char *nptr, char **endptr, int base);
```

с полностью аналогичным определением. В зависимости от длины слова в текущей архитектуре, она может быть аналогом strtoull() или strtoul().

Отрицательные значения допустимы во входных данных и без ошибки преобразуются в эквивалентное значение с типом unsigned long int.

## ПРИМЕР
Пример можно найти в справочной странице strtol(3); в ней показано использование похожих функций.

## СМОТРИТЕ ТАКЖЕ
a64l(3), atof(3), atoi(3), atol(3), strtod(3), strtol(3), strtoumax(3)


strverscmp

title: strverscmp(3)

summary: сравнение двух строк версий

text:
# strverscmp(3)

## ИМЯ
strverscmp - сравнение двух строк версий

## ОБЗОР

```
#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 <string.h>
#include <stdio.h>
#include <stdlib.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)


strxfrm

title: strxfrm(3)

summary: преобразование строки

text:
# strxfrm(3)

## ИМЯ
strxfrm - преобразование строки

## ОБЗОР

```
#include <string.h>
```

```
size_t strxfrm(char *dest, const char *src, size_t n);
```

## ОПИСАНИЕ
Функция strxfrm() преобразует строку src в такую форму, что выполнение strcmp(3) над двумя такими строками, преобразованными посредством strxfrm(), будет таким же, как и выполнение strcoll(3) над строками до преобразования. Первые n байт преобразованной строки помещаются в dest. Преобразование основывается на настройках категории текущей локали LC_COLLATE программы (смотрите setlocale(3)).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция strxfrm() возвращает количество байт, необходимое для размещения преобразованной строки в dest без завершающего байта null («\0»). Если возвращённое значение равно n или больше этой величины, то содержимое dest не определено.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

strxfrm()

Безвредность в нитях

MT-Safe locale

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
bcmp(3), memcmp(3), setlocale(3), strcasecmp(3), strcmp(3), strcoll(3), string(3)


swab

title: swab(3)

summary: меняет местами соседние байты

text:
# swab(3)

## ИМЯ
swab - меняет местами соседние байты

## ОБЗОР

```
#define _XOPEN_SOURCE       /* См. feature_test_macros(7) */
#include <unistd.h>
```

```
void swab(const void *from, void *to, ssize_t n);
```

## ОПИСАНИЕ
Функция swab() копирует n байт из массива, указанного в from в массив, указанный в to, меняя местами смежные чётные и нечётные байты. Эта функция используется при обмене данными между машинами, у которых разный порядок младшего/старшего байтов.

Данная функция ничего не делает, если n отрицательно. Если n положительно и нечётно, то обрабатываются n-1 байт, как описано выше, а для последнего байта действие не определено (другими словами, n должно быть чётно).

## ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция swab() не возвращает никаких значений.

## АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).

Интерфейс

Атрибут

Значение

swab()

Безвредность в нитях

MT-Safe

## СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

## СМОТРИТЕ ТАКЖЕ
bstring(3)