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
>char *strdup(const char *str); /* Копировать str */
Возвращаемое значение равно >NULL
, если была ошибка, или указатель на динамически выделенную память с копией >str
. Возвращенное значение должно быть освобождено с помощью >free()
, когда больше не требуется.
3.2.3. Системные вызовы: >brk()
и >sbrk()
Четыре функции, которые мы рассмотрели (