Читаем UNIX полностью

В табл. 6.2 перечислены некоторые средства работы со строками и ряд полезных функций, одна из которых strcmp. Как правило, лучше воспользоваться этими стандартными функциями, чем писать собственные, так как они отлажены и зачастую выполняются быстрее, чем написанные вами, поскольку были оптимизированы для конкретных машин (нередко благодаря использованию Ассемблера).

strcat(s,t)Добавляет строку t к строке s; возвращает s
strncat(s,t,n)Добавляет не более n символов t к s
strcpy(s,t)Копирует t в s; возвращает s
strncpy(s,t,n)Копирует точно n символов; при необходимости добавляет NULL
strcmp(s,t)Сравнивает s и t, возвращает <0, 0, >0 при <, ==, >
strncmp(s,t,n)Сравнивает не более n символов
strlen(s)Возвращает длину s
strchr(s,c)Возвращает указатель на первый символ с в s и NULL, если с отсутствует
strrchr(s,c)Возвращает указатель на последний с в s и NULL, если с отсутствует.
atoi(s)Возвращает целое значение s
atof(s)Возвращает "плавающее" значение s; необходимо описание double atof()
malloc(n)Возвращает указатель на область памяти в n байт и NULL, если это невозможно
calloc(n,m)Возвращает указатель на n*m обнуленных байтов и NULL, если это невозможно; malloc и calloc возвращают значение типа char*
free(p)Освобождает память, выделенную malloc и calloc

Таблица 6.2: Стандартные функции, выполняемые над строками

Упражнение 6.3

Измените аргумент -s так, чтобы vis -sn печатала только строки из n или более печатаемых символов, опуская непечатаемые символы и короткие последовательности обычных, печатаемых символов. Это полезно при выделении ''текстовых'' частей в нетекстовых файлах, таких, как рабочие программы. Некоторые версии системы содержат для подобных целей программу strings. Что лучше: иметь отдельную программу или пользоваться специальным аргументом vis?

Упражнение 6.4

Доступность исходной программы на Си — одно из достоинств системы UNIX; такая программа демонстрирует элегантные решения многих программистских проблем. Прокомментируйте баланс между наглядностью программы на Си и встречающимися "оптимизированными" фрагментами, переписанными на Ассемблере.

<p>6.3 Доступ к файлам: <code>vis</code> версия 3</p>

Две первые версии vis читают из стандартного входного потока и пишут в стандартный выходной поток, причем оба потока наследуются от shell. Следующий шаг модификация vis для работы с файлами по их именам, так что

$ vis файл1 файл2 ...

будет просматривать эти именованные файлы вместо стандартного входного потока. Если же имен файлов в качестве аргументов нет, vis должна читать стандартный входной поток.

Возникает вопрос: как организовать чтение файлов, т.е. как связать имена файлов с операторами ввода вывода, реально читающими данные? Правила просты. Прежде чем быть прочитанным или записанным, файл должен быть открыт стандартной библиотечной функцией fopen. Последняя берет имя файла (например, temp или /etc/passwd), взаимодействует с ядром и возвращает обратно "внутреннее имя", которое используется при последующих операциях с данным файлом.

Внутреннее имя является на самом деле указателем (называемым указателем файла) на структуру, содержащую информацию о файле, такую, как расположение буфера, текущую позицию символа в буфере, режим чтения или записи и т.п. Эта структура определяется в файле и имеет имя FILE. Описание указателя файла таково:

FILE *fp;

Перейти на страницу:

Похожие книги