Linux программирование в примерах | страница 66



должно содержать размер буфера. Обе функции обновляют >*n новым значением размера буфера, если они его изменяют.

>FILE* stream

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

По достижении конца файла или при ошибке функция возвращает -1. Строки содержат завершающий символ конца строки или разделитель (если он есть), а также завершающий нулевой байт. Использование >getline() просто, как показано в >ch03-getline.с:

>/* ch03-getline.c --- демонстрация getline(). */

>#define _GNU_SOURCE 1

>#include

>#include


>/* main - прочесть строку и отобразить ее, пока не достигнут EOF */

>int main(void) {

> char *line = NULL;

> size_t size = 0;

> ssize_t ret;

> while ((ret = getline(&line, &size, stdin)) != -1)

>  printf("(%lu) %s", size, line);

> return 0;

>}

Вот эта функция в действии, показывающая размер буфера. Третья входная и выходная строки намеренно длинные, чтобы заставить >getline() увеличить размер буфера:

>$ ch03-getline /* Запустить программу */

>this is a line

>(120) this is a line

>And another line.

>(120) And another line.

>A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee

>(240) A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee

3.2.2. Копирование строк: >strdup()

Одной чрезвычайно типичной операцией является выделение памяти для копирования строки. Это настолько типично, что многие программисты предусматривают для нее простую функцию вместо использования внутритекстового кодирования, и часто эта функция называется >strdup():

>#include


>/* strdup --- выделить память с malloc() и скопировать строку */

>char *strdup(const char *str) {

> size_t len;

> char *copy;

> len = strlen(str) + 1;

> /* включить место для завершающего '\0' */

> copy = malloc(len);

> if (copy != NULL) strcpy(copy, str);

> return copy; /* при ошибке возвращает NULL */

>}

С появлением стандарта POSIX 2001 программисты по всему миру могут вздохнуть свободнее: эта функция является теперь частью POSIX в виде расширения XSI:

>#include /* XSI */


>char *strdup(const char *str); /* Копировать str */

Возвращаемое значение равно >NULL, если была ошибка, или указатель на динамически выделенную память с копией >str. Возвращенное значение должно быть освобождено с помощью >free(), когда больше не требуется.

3.2.3. Системные вызовы: >brk() и >sbrk()

Четыре функции, которые мы рассмотрели (