|
Часть 5
- 214 -
Если pathname не имеет расширения для имени файла или если
оно не заканчивается точкой (.), тогда функция spawn устанавлива-
ет расширение .EXE. Если pathname имеет расширение, то использу-
ется только это расширение. Если pathname заканчивается точкой,
spawn осуществляет поиск pathname без расширения. Процедуры
execlp, execlpe, execvpe осуществляют поиск для pathname (исполь-
зуя те же процедуры) в директориях, определенных переменной окру-
жения PATH.
Аргументы для нового процесса передаются как аргументы в
вызове spawn, задавая один или более указателей на символьные
строки. Эти символьные строки образуют список аргументов для
child-процесса. Общая длина строк, образующих список аргументов
для нового процесса, не может превышать 128 байтов. Нулевой сим-
вол окончания '\0'для каждой строки в эту длину не засчитывается,
а символы пробела (автоматически вставляемые для аргументов)-зас-
читываются.
Указатели аргументов могут передаваться как отдельные аргу-
менты (в execl, execle, execlp, execlpe) или как массив указате-
лей (в execv, execve, execvp, execvpe). По крайней мере один ар-
гумент - arg0 или argv[0] - может передаваться к child-процессу.
По условию этот аргумент является копией аргумента pathname.
(Другое значение ошибки не вырабатывается). В версиях MS DOS,
ранних от 3.0, передаваемое значение arg0 или argv[0] не доступно
для использования в child-процессе. Однако, для версий MS DOS 3.0
и старше pathname доступно через arg0 или argv[0].
Вызовы execl, execle, execlp, execlpe обычно используются
тогда, когда количество аргументов известно заранее. Аргумент
arg0 обычно является указателем на pathname. Аргументы от arg1 до
argn являются указателями на символьные строки, образующие новый
список аргументов. NULL-указатель, идущий за аргументом argn, оп-
ределяет конец списка аргументов.
Вызовы execv, execve, execvp, execvpe используются, когда
число аргументов для нового процесса является переменным. Указа-
тели на аргументы пересылаются как массив argv. Аргумент argv[0]
обычно является указателем на pathname. Аргументы от argv[1] до
argv[n] являются указателями на символьные строки, образующие но-
вый список аргументов. Аргумент argv[n+1] может быть NULL-указа-
телем для определения конца списка аргументов.
Файлы, открытые при вызове spawn, остаются открытыми в но-
вом процессе. В вызовах execl, execlp, execv, execvp, child-про-
цесс наследует окружение parent-процесса. Вызовы execle, execlpe,
execve, execvpe позволяют пользователю изменять окружение для
child-процесса, передавая список установленного окружения через
аргумент envp.
Аргумент envp является массивом символьных указателей, каж-
дый элемент которого (исключая последний элемент) указывает на
строку, заканчивающуюся нулем и определяющую переменную окруже-
ния. Обычно эта строка имеет форму:
NAME = value,
где NAME - имя переменной окружения, value - значение стро-
ки, в которой устанавливается эта переменная. (Заметим, что value
не заключается в кавычки "..."). Последним элементом массива envp
должен быть NULL.
Child-процесс наследует установленное окружение parent-про-
цесса, когда envp является NULL.
- 215 -
Возвращаемое значение.
Возвращаемое значение является статусом выхода из
child-процесса. Статус выхода равен 0, если процесс нормально за-
вершен. Статус выхода устанавливается в ненулевое значение, если
child-процесс особым образом вызывает процедуру exit вместе с не-
нулевым аргументом. Если статус не установлен, то положительный
статус выхода указывает на непредвиденный выход из программы пос-
редством abort или прерывания.
Возвращаемое значение -1 свидетельствует об ошибке
(child-процесс не стартовал), и errno устанавливается в одно из
следующих значений:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
E2BIG Список аргументов превышает 128 байт
или простраство, требуемое для
информации окружения, превышает 32К.
EINVAL Аргумент modeflag неверный.
ENOENT Файл или path-имя не найдено.
ENOEXEC Определенный файл не является выполимым
или имеет неверный формат.
ENOMEN Достаточная память не доступна для
выполнения child-процесса.
Замечание! Вызовы spawn не сохраняют режим преобразования
для открытых файлов. Если child-процесс использует файлы, унасле-
дованные от parent-процесса, тогда процедура setmode применяется
для установки требуемого режима преобразования для этих файлов.
В child-процессе, созданном вызовами процедур spawn, сиг-
нальные установки не сохраняются. В child-процессе они переуста-
навливаются по умолчанию.
Cм. также abort, execl, execle, execlp, execlpe, execv,
execve, execvp, execvpe, exit, _exit, onexit, system.
Пример.
#include
#include
extern char **environ;
char *args[4];
int result;
args[0]="child";
args[1]="one";
args[2]="two";
- 216 -
args[3]=NULL;
.
.
.
/* все следующие операторы позволяют порождать процесс,
названный "child.exe", и передавать ему три аргумента. Первые три
аргумента приостанавливают parent-процесс, а последние три - свя-
зывают parent-процесс с child */.
result=spawnl(P_WAIT,"child.exe","child","one","two",
NULL);
result=spawnle(P_WAIT,"child.exe","child","one",
"two", NULL, environ);
result=spawnlp(P_WAIT, "child.exe","child","one",
"two", NULL);
result=spawnv(P_OVERLAY, "child.exe", args);
result=spawnve(P_OVERLAY, "child.exe", args, environ);
result=spawnvp(P_OVERLAY, "child.exe", args);
SPRINTF
#include
int sprintf(buffer, format-string[, argument...]);
char *buffer; память для хранения вывода
char *format-string; строка управления форматом
Описание.
Функция sprintf форматирует и запоминает наборы символов и
значений в buffer. Каждый аргумент argument (если он есть), пре-
образуется и выводится согласно соответствующей спецификации фор-
мата в format-string.
Format-string состоит из порядковых символов и имеет ту же
самую форму и функцию, что аргумент format-string для функции
printf. Смотрите функцию printf для описания format-string и ар-
гументов.
Возвращаемое значение.
Функция sprintf возвращает количество символов, записанных
в buffer.
См. также fprintf, printf, sscanf.
Пример.
#include
char buffer[200];
int i, j;
double fp;
char *s = "computer";
char c;
.
- 217 -
.
.
/* форматирует и печатает различные данные */
j = sprintf(buffer, "%s\n", s);
j + = sprintf(buffer+j, "%c\n", c);
j + = sprintf(buffer+j, "%d\n",i);
j + = sprintf(buffer+j, "%f\n",fp);.
SQRT
#include
double sqrt(x);
double x; неотрицательное значение с плавающей
точкой
Описание.
Функция sqrt вычисляет квадратный корень x.
Возвращаемое значение.
Функция sqrt возвращает результат вычисления квадратного
корня. Если x - отрицательное, функция печатает сообщение об
ошибке DOMAIN в stderr, устанавливает errno в EDOM и возвращает
0.
Обрaботкa ошибок может быть модифицировaнa при изменении
процедуры matherr.
См. также exp, log, matherr, pow.
Пример.
#include
#include
double x,y,z;
.
.
.
if ((z = sqrt(x+y))==o.0)
if((x+y) < 0.0)
perror("sqrt of a negative number");
SRAND
#include требуется только для
объявления функции
void srand(seed);
unsigned seed; начальное число для
генерации случайных
чисел.
- 218 -
Описание.
Функция srand устанавливает начальную точку для генерации
множества псевдослучайных целых. В качестве аргумента seed для
переустановки генератора используется 1. Любое другое значение
seed устанавливает генератор в начальную случайную точку.
Функция rand используется для поиска сгенерированных слу-
чайных чисел.
Возвращаемое значение.
Возвращаемого значения нет.
См. также rand.
Пример.
#include
#include
int x, ranvals [20];
/* устанавливает генератор случайных чисел в начальное сос-
тояние и сохраняет в массиве 20 первых сгенерированных случайных
чисел. */
srand(17);
for (x = 0; x < 20; ranvals[x++] = rand())
;.
SSCANF
#include
int sscanf(buffer, format-string[, argument...]);
char *buffer; хранимые данные
char *format-string; строка управления форматом
Описание.
Функция sscanf читает данные из buffer в расположение, за-
даваемое arguments. Каждый argument должен быть указателем на пе-
ременную такого типа, которая соответствует типу, определннному в
format-string.
Format-string интерпретирует поля ввода и имеет ту же самую
форму и функцию, что аргумент format-string для функции scanf.
Смотрите функцию scanf для описания format-string.
Возвращаемое значение.
Функция sscanf возвращает количество успешно преобразован-
ных и назначенных полей. В возвращаемом значении не содержатся
прочитанные но не назначенные поля. Значение EOF возвращается при
- 219 -
попытке считывания конца строки.Возвращаемое значение 0 означает,
что нет назначенных полей.
См. также fscanf, scanf, sprintf.
Пример.
#include
char *tokenstring = "15 12 14...";
int i;
float fp;
char s[81];
char c;
.
.
.
/* ввод различных данных */
sscanf(tokenstring, "%s", s);
sscanf(tokenstring, " %c", &c);
sscanf(tokenstring, "%d", &i);
sscanf(tokenstring, "%f", fp);.
STACKAVAIL
#include требуется только для объявления
функции
unsigned int stackavail();
Описание.
Функция stackavail возвращает приблизительный размер стека
в байтах, доступного для динамического размещения памяти посредс-
твом функции alloca.
Возвращаемое значение.
Функция stackavail возвращает размер в байтах как беззнако-
вое целое.
См. также alloca, freect, memavl.
Пример.
#include
main()
{
char * ptr;
printf("Stack memory available before alloca=%u\n",
stackavail());
ptr=alloca(100*sizeof(char));
printf("Stack memory available after alloca=%u\n",
stackavail());
}
- 220 -
STAT
#include
#include
int stat(pathname, buffer);
char *pathname; path-имя существующего файла
struct stat *buffer; указатель на строку, принимающую
результаты
Описание.
Функция stat получает информацию о файле или директории,
определенном по pathname, и запоминает ее в структуре, на которую
указывает buffer. Структура stat, объявленная в ,
содержит следующие поля.
Поле Значение
st_mode Битовая маска для информации о режиме
файла. Бит S_IFDIR устанавливается,
если pathname определяет директорий;
бит S_IFREG устанавливается, если
pathname ссылается на обычный файл.
Биты чтения/записи устанавливаются
пользователем в соответствии с режимом
доступа к файлу. Пользователь выполняет
установку битов, используемых для рас-
ширения имени файла.
st_dev Номер устройства диска, содержащего
файл.
st_rdev Номер устройства диска, содержащего
файл.
(аналогично st_dev).
st_nlink Всегда 1.
st_size Размер файла в байтах.
st_atime Время последней модификации файла.
st_mtime Время последней модификации файла
(аналогично st_atime).
st_ctime Время последней модификации файла
(аналогично st_atime и st_mtime).
В структуре типа stat существуют три дополнительных поля,
которые для MS DOS не имеют смысла.
- 221 -
Возвращаемое значение.
Функция stat возвращает значение 0, если получена информа-
ция о статусе файла. Возвращаемое значение -1 свидетельствует об
ошибке, и errno устанавливается в ENOENT, т.е. имя файла или
path-имя не найдено.
См. также access, fstat.
Замечание. Если заданный pathname ссылается на устройство,
поля размера и времени в структуре stat не имеют осмысленного
значения.
Пример.
#include
#include
#include
struct stat buf;
int result;
char *args[4];
.
.
.
result = stat("child.exe", &buf);
if (result == 0)
if (buf.st_mode & S_IEXEC)
execv("child.exe", args);
_STATUS87
#include
unsigned int _status87(); получает слово статуса
плавающей точки
Описание.
Функция _status87 получает слово статуса плавающей точки.
Слово статуса плавающей точки является комбинацией 8087/80287
слова статуса и других состояний, обнаруживаемых 8087/80287
handler-ом, таких как переполнение и потеря значимости стека пла-
вающей точки.
Возвращаемое значение.
Биты в возвращаемом значении обозначают статус плавающей
точки. Смотрите include-файл для полного описания би-
тов, возвращаемых функций _status87.
Замечание! Большинство из математических библиотечных функ-
ций модифицируют слово статуса 8087/80287 с непредсказуемыми ре-
зультатами. Возвращаемые значения функций _clear87 и _status87
- 222 -
становятся более достоверными после выполнения нескольких опера-
ций с плавающей точкой с известными сообщениями слова статуса
плавающей точки.
См. также _clear87, _control87.
Пример.
#include
#include
double a = 1e-40, b;
float x,y;
main()
{
printf("status=%.4x-clear\n",_status87());
/* запомненное в y является неточным и с потерянной значи-
мостью */
y = a;
printf("status=%.4x-inexect,underflow\n",
_status87());
/* y неверно */
b = y;
printf("status=%.4x-inexect,underflow,denormal\n",
_status87());
/* очистка пользователем 8087 статуса */
_clear87();
}
STRCAT-STRDUP
#include требуется только для объявления
функции
char *strcat(string1,string2);
добавляет string2 к string1
char *string1; строка-приемник
char *string2; строка-источник
char *strchr(string,c); находит первое вхождение
c в string
char *string; строка-источник
int c; поисковый символ
int strsmp(string1,string2); сравнивает строки
char *string1;
char *string2;
int strcmpi(string1,string2); сравнивает строки вне
зависимости от типа
регистра
- 223 -
char *string1;
char *string2;
char strcpy(string1,string2); копирует string2 в
string1
char *string1; строка-приемник
char *string2; строка-источник
int strcspn(string1,string2); находит первую подстроку
символов в string1, не
входящую в string2
char *string1; строка-источник
char *string2; множество символов
char *strdup(string); дублирует строку
char *string; строка-источник
int stricmp(string1,string2); сравнивает строки вне
зависимости от типа
регистра
char *string1;
char *string2;
Описание.
Функции strcat, strchr, strcmp, strcmpi, strcpy, strspn,
strdup, stricmp работают со строками, оканчивающимися '\0' симво-
лом. Аргументы строк для этих функций предполагают наличие нуле-
вого символа ('\0'), отмечающего конец строки.
При копировании или добавлении строк проверка на переполне-
ние не выполняется.
Функция strcat добавляет string2 к string1, заканчивает ре-
зультирующую строку нулевым символом и возвращает указатель на
строку-приемник (string1).
Функция strchr возвращет указатель на первое вхождение c в
string. Символ c может быть нулевым символом ('\0'); нулевой символ
окончания string включается в поиск. Функция возвращает NULL, ес-
ли символ не найден.
Функция strcmp лексикографически сравнивает строки string1
и string2 и возвращает значение, обозначающее их соотношение так,
как показано ниже.
Значение Его смысл
меньше 0 string 1 меньше string 2
0 string 1 равна string 2
больше 0 string 1 больше string 2
Функции strcmpi и stricmp являются причинно-нечувствитель-
ными версиями strcmp. Два аргумента string1 и string2 сравнивают-
ся вне зависимости от типа регистра; это обозначает, что формы
букв верхнего и нижнего регистров рассматриваются эквивалентными.
Функция strcpy копирует string2 (включая нулевой символ
- 224 -
окончания) в расположение, которое определяется по string1, и
возвращает string1.
Функция strcspn возвращает индекс первого символа в
string1, который принадлежит множеству символов srting2. Это зна-
чение эквивалентно длине начальной подстроки строки string1, ко-
торая содержит все символы, не входящие в строку string2. При по-
иске нулевые символы окончания не рассматриваются. Если string1
начинается с символа, содержащегося в строке string2, strcspn
возвращает 0.
Функция strdup захватывает память (с возвратом malloc) для
копирования string и возвращает указатель на память, содежащую
скопированную строку. Функция возвращает NULL, если память не мо-
жет быть захвачена.
Возвращаемые значения для этих функций описаны выше.
См. также strncat, strncmp, strncpy, ctrnic,p, strrchr,
strspn.
Пример.
#include
char string[100], template[100], *result;
int numresult;
.
.
.
/* создает строку "computer program" посредством использо-
вания strcpy и strcat */
strcpy(string, "computer");
result = strcat(string," program");
/* находит строку, в которой первый раз обнаружено 'a' */
result = strchr(string,'a');
/* определяет, является ли строка больше, меньше или равной
другой */
numresult = strcmp(string, template);
/* сравнивает две строки вне зависимости от типа регистра
*/
numresult = strcmpi("hello", "HELLO");
/* создает копию строки */
result = strcpy(template,string);
/* находит "a","b","c" в строке */
strcpy(string,"xyzabbc");
result = strcspn(string,"abc");
/* создает новый указатель на строку для дублирования стро-
ки */
result = strdup(string);
STRERROR
#include требуется только для объявления
функции
char *strerror(string);
char *string; сообщение, поставляемое
- 225 -
пользователем
int errno; счетчик ошибок
int sys_nerr; счетчик сообщений системы
char sys_errlist[sys_nerr];
массив сообщений об ошибках
Описание.
Если string равна NULL, функция strerror возвращает указа-
тель на строку, содержащую системное сообщение об ошибке для пос-
леднего библиотечного вызова, в котором выработана ошибка; эта
строка оканчивается символом новой строки ('\n').
Если string не равна NULL, strerror возвращает указатель на
строку, содержащую сообщение об ошибке, поставляемое пользовате-
лем; двоеточие; пробел; системное сообщение об ошибке для послед-
него библиотечного вызова, выработавшего ошибку; и символ новой
строки ('\n'). Сообщение пользователя может иметь максимальную дли-
ну до 94 байта.
В отличии от perror, strerror не печатает никаких сообще-
ний. Для печати сообщения, возращаемого strerror в stderr, в
программе должен быть оператор printf, например:
if((access("datafile",2))++-1)
printf(strerror(NULL));
Номер ошибки хранится в переменной errno, которая объявлена
на внешнем уровне. Системные сообщения об ошибках доступны через
переменную sys_errlist, которая является массивом сообщений для
ошибок из счетчика ошибок. По функции strerror посредством ис-
пользования значения errno как индекса к sys_errlist можно уста-
новить приблизительные сообщения об ошибках. Значение переменной
sys_nerr определяется как максимальное число элементов в массиве
sys_errlist.
Чтобы выработать правильный результат, функция strerror
должна быть вызвана сразу после библиотечной процедуры, возвраща-
ющей ошибку. Иначе значение errno может быть перезаписано для
последующих вызовов.
Возвращаемое значение.
Функция strerror не возвращает никакого значения.
См. также clearerr, ferror, perror.
Замечание. В MS DOS некоторые значения errno, приведенные в
, не используются. См. приложение А "Сообщения об ошиб-
ках", где приведен список значений errno и соответствующие сооб-
щения об ошибках, которые применяются в MS DOS . Для любого зна-
чения errno, не используемого в MS DOS, функция strerror печатает
пустую строку.
Пример.
#include
#include
- 226 -
#include
#include
#include
int fh1, fh2;
fh1 = open("data1", O_RDONLY);
if (fh1==-1)
strerror("open failed on input file");
fh2 = open("data2", O_WRONLY : O_CREAT,
S_IREAD : S_IWRITE);
if (fh2==-1)
srterror("open failed on output file");
STRLEN
#include требуется только для объявления
функции
int strlen(string);
char *string; строка, заканчивающаяся нулевым
символом
Описание.
Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания ('\0') в длину не засчитывается.
Возвращаемое значение.
Функция возвращает длину string. Возвращаемого значения в
случае возврата нет.
Пример.
#include
char *string="some space";
int result;
.
.
.
/* определяет длину строки */
result=strlen(string); /* result = 10 */
STRLWR
#include требуется только для объявления
функции
char strlwr(string);
char *string; преобразуемая строка
- 227 -
Описание.
Функция strlwr преобразовывает любые буквы верхнего регист-
ра из заданной строки string, заканчивающейся нулевым символом, в
буквы нижнего регистра. Другие символы не рассматриваются.
Возвращаемое значение.
Функция strlwr возвращает указатель на преобразуемую строку
string. Возвращаемого значения в случае ошибки нет.
См. также strupr.
Пример.
#include
char string[100], *copy;
.
.
.
/* создает копию строки в символах нижнего регистра */
copy=strlwr(strdup(string));
STRNCAT-STRNSET
#include требуется только для объявления
функции
char *strncat(string1,string2,n);
добавляет n символов string2 к
string1
char *string1; строка-приемник
char *string2; строка-источник
unsigned int n; количество добавляемых символов
char *strncmp(string1,string2,n);
сравнивает первые n символов
строк
char *string1;
char string2;
unsigned int n; количество сравниваемых симво-
лов
int strnicmp(string1,string2,n);
сравнивает первые n символов
строки
char *string1;
char string2;
unsigned int n; количество сравниваемых симво-
лов
- 228 -
char *strncpy(string1,string2,n);
копирует n символов string2 в
string1
char *string1; строка-приемник
char *string2; строка-источник
unsigned int n; количество добавляемых символов
char *strnset(string,c,n,);
инициализирует n первых симво-
лов строки string
char *string; инициализируемая строка
int c; символ-приемник
unsigned int n; количество принимаемых символов
Описание.
Функции strncat, strnsmp, stricmp, strncpy, strnset работа-
ют с первыми n символами строк, оканчивающимися нулевым символом.
Функция strncat добавляет n первых символов строки string2
к строке string1, заканчивает результирующую строку нулевым сим-
волом ('\0') и возвращает указатель на строку-приемник (string1).
Если n больше, чем длина строки string2, тогда вместо n использу-
ется длина строки.
Функция strncmp лексикографически сравнивает первые n сим-
волов строк string1 и string2 и возвращает значение, которое ука-
зывает на отношение между подстроками, как приведено ниже:
Значение Его смысл
меньше 0 substring 1 меньше substring 2
0 substring 1 равна substring 2
больше 0 substring 1 больше substring 2
Функция stricmp является причинно-нечувствительной версией
strncmp; функция stricmp сравнивает две строки string1 и string2
вне зависимости от чувствительности к регистрам; это обозначает,
что формы букв верхнего и нижнего регистров рассматриваются как
эквивалентные.
Функция strncpy копирует точно n символов строки string2 к
строке string1 и возвращает string1. Если n меньше, чем длина
string2, нулевой символ окончания ('\0') автоматически не добавля-
ется к копируемой строке. Если n больше, чем длина string2, ре-
зультат string1 заполняется нулевыми символами, вплоть до дости-
жения длины n.
Функция strnset устанавливает первые n символов string в
символ c и возвращает указатель на измененную строку. Если n
больше, чем длина строки string, вместо n используется длина
string.
См. также strcat, strcmp, strcpy, strset.
- 229 -
Пример.
#include
char string[30]={"12345678901234567890"};
main()
{
char copy[100], suffix[100], *result;
int numresult;
unsigned int nresult;
.
.
.
/* комбинирует строку со строкой suffix, не более чем 10
символов (30 минус длина начальной строки). (Если в примере ис-
пользуется более 10 символов, в память будет записано любое дру-
гое значение) */
result = strncat(string,suffix,10);
/* определяет порядок слов в строке, которая содержится в
"program", но рассматривает не более 7 символов. Если строка со-
держит префикс "program", strncmp возвращает 0 */
strcpy(string,"programmer");
numresult = strncmp(string,"program",7);
/* сравнивает 4 символа двух строк вне зависимости от типа
регистра */
strcpy(string,"PROGRESS");
nresult = stricmp(string,"program",4);
/* копирует 99 символов строки */
result = strncpy(copy,string,99);
/* устанавливает первые 4 символа строки в символ 'x' */
result = strnset("computer",'x',4);
}
STRPBRK
#include требуется только для объявления
функции
char *strpbrk(string1,string2);
находит любой символ из string2
в string1
char *string1; строка-источник
char *string2; множество символов
- 230 -
Описание.
Функция strpbrk находит первое вхождение в string1 любого
символа из string2. Нулевой символ окончания при поиске не расс-
матривается.
Возвращаемое значение.
Функция strpbrk возвращает указатель на первое вхождение
символа из string2 в string1.
NULL-указатель определяет отсутствие общих символов в
string1 и в string2.
См. также strchr, strrchr.
Пример.
#include
char string[10], *result;
.
.
.
/* возвращает указатель на первое вхождение в строке либо
'a,' либо 'b' */
result = strpbrk(string,"ab");
STRRCHR
#include требуется только для объявления
функции
char *strrchr(string,c);
находит последнее вхождение c в
string
char *string; строка-источник
int c; символ поиска
Описание.
Функция strrchr находит последнее вхождение символа c в
строке string. Нулевой символ окончания ('\0') строки string вклю-
чается в поиск. (Используется strchr для поиска первого вхождения
c в строке string).
Возвращаемое значение.
Функция strrchr возвращает указатель на последнее вхождение
c в string. Указатель NULL возвращается, если заданный символ не
найден.
См. также strchr, strpbrk.
Пример.
#include
- 231 -
char string[100], *result;
.
.
.
/* находит последнее вхождение символа 'a' в строке */
result = strrchr(string,'a');.
STRREV
#include требуется только для объявления
функции
char *strrev(string);
char *string; сохраняемая строка
Описание.
Функция strrev сохраняет порядок символов в заданной строке
string. Нулевой символ окончания ('\0') остается на месте.
Возвращаемое значение.
Функция strrev возвращает указатель на измененную string.
Возвращаемого значения в случае ошибки нет.
См. также strcpy, strset.
Пример.
#include
char string[100];
int result;
.
.
.
/* определяет, является ли строка палиндромом, т.е. читает-
ся одинаково в прямом и обратном порядке */
result = strcmp(string,strrev(strdup(string)));
/* если result == 0, строка является палиндромом */
STRSET
#include требуется только для объявления
функции
char *strset(string,c);
char *string; устанавливаемая строка
int c; символ-приемник
Описание.
Функция strset устанавливает в c все символы из заданной
строки string, исключая нулевой символ окончания ('\0').
- 232 -
Возвращаемое значение.
Функция strset возвращает указатель на измененную строку.
Возвращаемого значения нет.
См. также strnset.
Пример.
#include
char string[100], *result;
.
.
.
/* устанавливает строку, состоящую из пробелов */
result = strset(string, ' ');
STRSPN
#include требуется только для объявления
функции
int strspn(string1,string2);
char *string1; поисковая строка
char *string2; множество символов
Описание.
Функция strspn возвращает индекс первого символа в строке
string1, который не принадлежит множеству символов string2. Это
значение эквивалентно длине начальной подстроки в строке string1,
которая полностью состоит из символов строки string2. Нулевой
символ окончания строки string2 не рассматривается. Если string1
начинается с символа, не входящего в string2, strcpn возвращает
0.
Возвращаемое значение.
Функция strspn возвращает целое значение, определяющее по-
зицию первого символа в string1, и не содержащегося в string2.
См. также strcspn.
Пример.
#include
char *string="cabbadge";
int result;
.
.
.
/* определяет длину префикса, содержащего a,b и c */
result = strspn(string,"abc"); /* result = 5 */
- 233 -
STRSTR
#include требуется только для объявления
функции
char *strstr(srting1,string2);
char *string1; поисковая строка
char *string2; строка-шаблон
Описание.
Функция strstr возвращает указатель на первое вхождение
string1 в string2.
Возвращаемое значение.
Функция strstr возвращает указатель на string1, если
string1 обнаружена, и NULL - если string1 нет.
См. также strcspn.
Пример.
#include
main()
{
char *string1="needle in a haystack";
char *string2="hay";
printf("%s\n", strstr(string1,string2));
}
На выходе:
haystack
STRTOD-STRTOL
#include
double strtod(nptr, endptr); преобразует строку,
на которую указывает
nptr, в double
char *nptr; указатель на строку
char **endptr; указатель на конец
просмотра
long strol(nptr,endptr,base); преобразует строку в
long десятичное це-
лое, эквивалентное
числу с данным осно-
ванием base
char *nptr;
- 234 -
char **endptr;
int base; используемое основа-
ние
Описание.
Функции strtod и strtol соответственно преобразуют символь-
ную строку к значению с двойной точностью или к длинному целому
значению. Исходная строка string представляет собой последова-
тельность символов, которые интерпретируются как числовое значе-
ние специального типа. Эти функции прекращают чтение строки как
только встретится символ, который не может быть частью числа (это
может быть нулевой символ '\0 в конце строки); для strtol символом
прерывания может быть также первый цифровой символ, который боль-
ше или равен base. Если endptr - не NULL, *endptr указывает на
тот символ, на котором останавливается просмотр.
Функция strtod предполагает, что nptr указывает на строку,
имеющую следующую форму:
[whitespace][sign][digiits][.digits][{d:D:e:E}[sign]digits]
При появлении первого символа, не отвечающего этой форме,
обработка прекращается.
Функция strtol предполагает, что nptr указывает на строку
следующей структуры:
[whitespace][sign][0][x][digits]
Если base лежит между 2 и 36, это значение используется как
основание системы счисления данного числа.
Если base = 0, начальные символы строки, на которые указы-
вает nptr, используются для определения основания. Если первый
символ - 0 и второй - одна из цифр от 1 до 7, то строка интерпре-
тируется как восьмеричное целое; если первый символ 0, а второй x
или X, тогда строка понимается как шестнадцатеричное целое; если
первый символ принадлежит последовательности 1-9, то строка пони-
мается как десятичное целое.
Возвращаемое значение.
Функция strtod возвращает значение числа с плавающей точ-
кой, исключая случаи переполнения или потери результата (т.е. аб-
солютное значение результата меньше, чем это допустимо диапазоном
представления числа). В случае переполнения или потери значимости
результата возвращается соответственно +HUGE или -HUGE.
Функция strtol возвращает значение преобразованной строки,
исключая случай переполнения или потери результата. В этом случае
возвращается соответственно LONG_MAX или LONG_MIN. Обе функции
устанавливают errno в ERANGE.
См. также atof, atol.
Пример.
#include
- 235 -
main()
{
char *string, *stopstring;
double x;
long l;
int bs;
string="3.1415926This stopped it";
x=strtod (string, &stopstring);
printf ("string=%s\n",string);
printf ( strtod=%ld (base %d)\n", l, bs);
printf (" Stopped scan at %s\n\n", stopstring);
string="10110134932";
printf ("string=%s\n", string);
for (bs=2; bs<=8; bs*=2) {
l=strtol(string, &stopstring, bs);
printf (" strtol=%ld (base %d)\n",l,bs);
printf (" Stopped scan at %s\n\n",stopstring);
}
}
На выходе:
string = 3.1415926This stopped it
strtod = 3.141593
Stopped scan at This stopped it
string = 10110134932
strtol = 45 (base 2)
Stopped scan at 34932
strtol = 4423 (base 4)
Stopped scan at 4932
strtol = 2134108 (base 8)
Stopped scan at 932
STRTOK
#include требуется только для объявления
функции
char *strtor(string1,string2);
находит символ в string1
char *string1; строка, содержащая символы
char *string2; множество символов-ограничителей
Описание.
Функция strtok читает строку string1 как множество нуль или
более знаков, служащих в качестве ограничителей для символов в
string1. Символы в string1 могут отделяться одним или более огра-
- 236 -
ничителем от string2. Символы в string1 разрываются столько раз,
сколько вызывается strtok. При первом вызове strtok для заданной
строки string1, strtok находит первый символ в string1, пропуская
предыдущие ограничители. Указатель возвращается на первый знак.
Для того, чтобы прочитать следующий символ из string1, функция
strtok вызывается вместе с NULL значением для аргумента string1.
Аргумент NULL строки string1 вызывает strtok для поиска следующе-
го знака в предыдущей строке символов. Множество ограничителей
может быть различным от вызова к вызову, так как string2 может
принимать любые значения.
Замечание. String1 можно модифицировать вызовами strtok,
так как после вызова strtok в string1 вставляется нулевое значе-
ние ('\0').
Возвращаемое значение.
При вызове strtok первый раз, она возвращает указатель на
первый символ в string1. При последующих вызовах в этой же самой
строке символов, strtok возвращает указатель на следующий символ
в строке. Указатель NULL возвращается, когда нет больше символов.
Все символы оканчиваются нулем.
См. также strcspn, strspn.
Пример.
#include
#include
char *string = "a string, of , ,tokens";
.
.
.
/* в следующем цикле собираются символы (отделенные пробе-
лами или запятыми) из строки до тех пор, пока в ней ничего не ос-
танется */
token = strtok(string,",");
while (token !=NULL) {
/* вставляет код для обработки символа в цикле */
.
.
.
token = strtok(NULL,",");
/* берет следующий символ */
}
/* возвращаемыми символами являются "a","string", "of",
"tokens". Следующий вызов strtok возвратит NULL и цикл завершает-
ся */
STRUPR
#include требуется только для объявления
функции
- 237 -
char *strupr(string);
char *string; строка, преобразуемая к
верхнему регистру
Описание.
Функция strupr преобразует любые буквы нижнего регистра из
заданной string к буквам верхнего регистра. Другие символы не
рассматриваются.
Возвращаемое значение.
Функция strupr возвращает указатель на преобразуемую строку
string. Возвращаемого значения в случае ошибки нет.
См. также strlwr.
Пример.
#include
char string[100], *copy;
.
.
.
/* следующий оператор делает копию строки в верхнем регист-
ре */
copy = strupr(strdup(string));
SWAB
#include требуется только для
объявления функции
void swab(source, destination, n);
char *source; копируемые и перестав-
ляемые (обмениваемые)
данные
char *destination; хранение переставлен-
ных данных
int n; число копируемых
байтов
Описание.
Функция swab копирует n байтов из source, переставляет (об-
менивает) каждую пару смежных байтов и хранит результат в
destination. Целые n могут быть одинаковыми числами, подлежащими
перестановке (обмену).
Функция swab обычно используется для подготовки двоичных
данных при пересылке их к вычислительной машине, которая исполь-
зует различный порядок байтов.
Возвращаемое значение.
Возвращаемого значения нет.
См. также fgets, fputs.
|
|