Эти функции используются для:
Главными преимуществами стандартных библиотечных функций Си являются мобильность и низкие затраты на сопровождение пользовательских приложений. Библиотечные функции не подвержены частым изменениям, поэтому программы, в которых они используются, легки в сопровождении. Некоторые из этих библиотечных функций соответствуют стандарту
Стандартные библиотечные функции Си объявляются в наборе /usr/include. Опишем библиотечные функции
<stdio.h> <stdlib.h> <string.h> <memory.h> <malloc.h> <time.h> <assert.h> <stdarg.h> <getopt.h> <setjmp.h>
Кроме указанных, в большинстве UNIX-систем есть
<pwd.h> <grp.h> <crypt.h>.
В этих libc.a. Эти функции полезны для разработки приложений.
В <stdio.h> объявляется тип данных FILE, который используется в Си-программах для обозначения потоковых
| Потоковая функция или макрокоманда | Назначение |
|---|---|
fopen |
Открывает |
fclose |
Закрывает |
fread |
Читает блок данных из |
fgets |
Читает строку текста из |
fscanf |
Читает форматированные данные из |
fwrite |
Записывает блок данных в |
fputs |
Записывает строку текста в |
fprintf |
Записывает форматированные данные в |
fseek |
Перемещает |
ftell |
Возвращает текущую позицию в |
freopen |
Повторно использует |
fdopen |
Открывает потоковый |
feof |
Макрокоманда, которая возвращает ненулевое значение, если в данном |
ferror |
Макрокоманда, которая возвращает ненулевое значение, если в данном |
clearer |
Макрокоманда, которая сбрасывает флаг наличия ошибок в данном |
fileno |
Макрокоманда, которая возвращает дескриптор данного потокового |
В заголовке <stdlib.h> объявляется набор функций, служащих для преобразования данных, генерации случайных чисел, получения и установки переменных среды shell, управления выполнением программ и выполнения команд shell. Обычно эти функции объявляются в заголовке <stdio.h>, но так как они не включают в себя манипулирование
В заголовке <string.h> объявляется набор функций, предназначенных для манипулирования символьными строками.
В заголовке <memory.h> объявляется набор функций, предназначенных для манипулирования байтовым struct.
В заголовке <time.h> объявляется набор функций, предназначенных для вызова системных параметров времени. Они могут применяться для определения местного времени и даты, времени и даты в универсальном формате (UTC), а также статистических данных об использовании процессами времени центрального процессора.
В заголовке <assert.h> объявляется макрокоманда, используемая для проверки некоторых условий выполнения процесса, которые в нормальной ситуации всегда должны быть истинны. Если все же во время выполнения процесса условие не выполняется, то макрокоманда выводит сообщение об ошибке в стандартный
В заголовке <setjmp.h> объявляется набор функций, которые позволяют процессу вызывать оператор перехода goto из одной функции в другую. Вызов Си-оператора goto позволяет процессу передать управление выполнением от одного оператора к другому лишь в рамках этой же функции. Функции, определенные в заголовке <setjmp.h> устраняют данное ограничение. Эти функции необходимо использовать лишь тогда, когда без них действительно нельзя обойтись. Например, если ошибка обнаружена в рекурсивной функции, то есть смысл сообщить об ошибке, а затем выполнить оператор перехода goto в основную функцию, т.е. как бы начать процесс сначала.
В заголовке <pwd.h> определяется набор функций, предназначенных для получения учетной информации о пользователях.
В заголовке <grp.h> определяется набор функций, предназначенных для получения учетной информации о группах, содержащейся в UNIX- /etc/group.
В заголовке <crypt.h> объявляется набор функций, предназначенных для шифрования и дешифрования данных. Это очень важные функции, обеспечивающие безопасность системы. Например,
Получение getchar( ) обычно задают как stdio.h, в то время как strlen( ) обычно хранится в библиотечном
Во многих больших системах UNIX вы только компилируете программы. А
Если функция задана как #include включить ctype.h, содержащий
На некотором этапе компиляции или загрузки программы вы можете выбрать
Очевидно, мы не сможем рассмотреть все особенности всех систем, но эти три примера показывают, что вас ожидает!
Один способ организации связи программы с < и >. Этот метод прост, но ограничен. Язык Си предоставляет и более мощные методы связи с fopen( ), которая открывает fclose( ) для
struct_iobuf {
char*_ptr; /* текущий указатель буфера*/
int_cnt; /* текущий счетчик байтов*/
char*_base; /* базовый адрес буфера ввода-вывода*/
char_flag; /* управляющий признак*/
char_file; /* номер файла*/
}
#define FILE struct_iobuf /* краткая запись*/
Здесь мы не собираемся разбираться детально в этом определении. Главное состоит в том, что FILE. Многие системы используют typedef для установления этого соответствия. Таким образом, программа, имеющая дело с FILE, чтобы делать так.
Рассмотрим пример чтения содержимого File, и
#include <stdio.h>
main( )
{
FILE *in; /* описываем указатель на файл */
int ch;
if ((in = fopen("File", "r") ) != NULL) {
/* открываем File для чтения,
проверяя существует ли он */
/* указатель FILE ссылается теперь на File */
while ((ch = getc(in)) != EOF)
/* получаем символ из in */
putc(ch, stdout);
/* посылаем ch на стандартный вывод*/
fclose(in); /* закрываем файл */
}
else
printf (" Файл не открывается\"File\".\n");
}
Объясним работу: fopen( ), fclose и использование функций ввода-вывода
Функцией fopen( ) управляют три основных параметра. Первый - имя fopen( ). В нашем примере это " File ". Второй параметр описывает, как должен использоваться
" r " -
" w " -
" a " -
" w+ " - новый
" r+ " - существующий
" a+ " - w+ "можно открыть существующий r+ " в режиме " a+ " можно вести запись в конец
Некоторые системы предоставляют еще дополнительные возможности, которые мы здесь не будем рассматривать. Используемые коды являются строками, а не символьными константами. При применении " r " открывается существующий "w" для существующего файла, то старая версия его стирается, и ваша программа начинает записывать на чистое место. Третий параметр является
FILE *in;
in=fopen("File","r");
Теперь in является File ". С этого момента программа ссылается на in, а не по имени File. ( stdio.h содержит строку
FILE *fopen( )
Если fopen( ) не способна открыть требуемый NULL, определенное в stdio.h как 0.
В нашем примере показано, как нужно закрывать
fclose(in);
Аргумент функции является fclose( ) возвращает значение 0, если EOF в противном случае.
Функции fopen( ) и fclose( ) работают с fclose( ) заключается в том, чтобы освободить любые частично заполненные
Две функции getc( ) и putc( ) работают аналогично функциям getchar( ) и putchar( ) (описанным в предыдущих лекциях). Разница заключается в том, что вы должны сообщить, какой
char ch; ch=getchar( );
предназначена для получения символа от стандартного
ch=getc(in);
- для получения символа от in.
putchar(ch);
выводит символ на стандартный
putc(ch,t);
предназначена для записи символа ch в t типа FILE.
Все функции ввода-вывода, которые мы использовали в предыдущих лекциях, имеют аналоги для ввода-вывода FILE, чтобы сообщить функциям с каким getc( ) и putc( ) эти функции используются после функции fopen( ), открывающей fclose( ), закрывающей его.
Эти функции ввода-вывода работают почти как printf( ) и scanf( ) (см. лекцию 4), но им нужен дополнительный аргумент для ссылки на сам
#include <stdio.h>
main( )
{
FILE *fi;
int age;
fi=fopen("File","r"); /* считывание */
fscanf(fi,"%d",age); /* fi указывает на File */
fclose(fi);
fi=fopen("Data", "a"); /*дополнение*/
fprintf(fi,"Data is %d.\n",age);
/*fi указывает на Data*/
fclose(fi);
}
В отличие от getc( ) и putc( ) эти функции получают FILE в качестве первого аргумента.
Эта функция имеет три аргумента, в то время как gets( ) имеет лишь один. Пример ее использования:
/* Программа считывает файл строка за строкой */
#include <stdio.h>
#define MAX 80
main( )
{
FILE *f1;
char *string[MAX];
f1=fopen("File","r");
while (fgets(string,MAX,f1) != NULL)
puts(string);
}
Мы расположили вводимую информацию в символьном string. Первый из трех аргументов функции fgets( ) является MAX-1, в зависимости от того, что произойдет раньше. В любом случае нуль-символ ' \0 ' добавляется в самый конец строки. Третий аргумент указывает на gets( ) и fgets( ) заключается в том, что gets( ) заменяет символ новой строки на ' \0 ', в то время как fgets( ) сохраняет символ новой строки. Подобно gets( ) функция fgets( ) возвращает значение NULL, если встречает символ EOF
. Это позволяет нам проверить, достигли ли мы конца
Эта функция похожа на функцию puts( ). Оператор
l=fputs("Строка", fi);
| Код | Положение в |
|---|---|
0 |
начало |
1 |
текущая позиция |
2 |
конец |
Передает строку " Строка " в fi типа FILE. Конечно, сначала нужно открыть fopen( ).
l является целым числом, которое устанавливается в EOF, если fputs( ) встречает EOF или ошибку. Эта функция не ставит завершающий символ ' \0 ' в конце копируемой строки. В отличии от puts функция fputs( ) не добавляет символ новой строки в ее
Функция fseek( ) позволяет нам обрабатывать fopen( ). fseek( ) имеет три аргумента и возвращает значение типа int.
Покажем на примере работу fseek( ):
/* использование fseek( ) для печати содержимого файла */
#include <stdio.h>
int main(int number, char *names[])
{
FILE *fp; long set = 0L;
if(number<2)
puts("Введите имя файла в качестве аргумента.");
else {
if ((fp=fopen(names[1],"r")) == 0)
printf("Нельзя открыть %s\n",names[1]);
else {
while(fseek(fp, set++,0) ==0)
putchar(getc(fp));
fclose(fp);
}
}
}
Первый из трех аргументов функции fseek( ) является FILE на fopen( ). Второй аргумент " set " . Этот аргумент сообщает, как далеко следует передвинуться от начальной точки (см. ниже). Он должен иметь значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад). Третий аргумент является кодом, определяющим начальную точку.
Функция fseek( ) возвращает 0, если все хорошо, и -1, если есть ошибка. Поскольку переменная set инициализирована нулем, при первом прохождении через цикл
while(fseek(fp,set++,0)==0) putchar(getc(fp));
мы имеем выражение
fseek(fp,OL,0);
означающее, что мы идем в fp, и находим байт, отстоящий на 0 байт от начала, т.е. первый байт. Затем функция putchar( ) печатает содержимое этого байта. При следующем прохождении через цикл переменная set увеличивается до 1L, и печатается следующий байт. То есть, переменная set действует подобно индексу для элементов set не попытается попасть в fseek( ) после конца fseek( ) возвращает значение -1 и цикл прекращается.
Пусть нам нужно распределить
char str[ ] = "Символьная строка";
Будет выделена
int mas[150];
Это описание выделяет 150 ячеек malloc( ). И без
/* добавляем память, если необходимо */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STOP "\n" /* сигнал прекращения ввода */
#define BLOCK 100 /*байты памяти */
#define LIM 40 /*предельная длина вводимой строки*/
#define MAX 50 /*максимальное число вводимых строк */
#define TIME 20000 /* большая задержка времени */
main ( )
{
char store[BLOCK]; /* исходный блок памяти*/
char symph[LIM]; /* приемник вводимых строк*/
char *end; /* указывает на конец памяти */
char *starts[MAX]; /* указывает на начала строк*/
int index = 0; /*количество вводимых строк */
int count; /* счетчик*/
char malloc( ); /* распределитель памяти */
starts[0]=store;
end=starts[0]+BLOCK-1;
puts("Вводите строки по одной");
puts("для завершения ввода в начале строки нажимите клавишу [ввод]");
puts("Начинайте!.");
while(index<MAX) {
if(fgets(symph,LIM,stdin))
if (strcmp(fgets(symph,LIM,stdin),STOP) == 0)
break;
if(strlen(symph)>end - starts[index]) {
/* действия при недостатке памяти для
запоминания вводимых данных*/
puts("подождите, программа попробует найти дополнительную память");
starts[index]=malloc(BLOCK);
end=starts[index]+BLOCK- 1;
for(count=0; count<TIME; count++);
puts("память найдена");
}
strcpy(starts[index],symph);
starts[index+1]=starts[index] + strlen(symph)+1;
if(++index<MAX)
printf("Строка: %d. продолжайте.\n", index);
}
puts("Вывод программы");
for(count=0; count<index; count++)
puts(starts[count]);
}
Давайте посмотрим, что делает функция malloc( ). Она берет аргумент в виде целого без знака, которое представляет количество требуемых байтов malloc(BLOCK) требует 100 байт. Функция возвращает char в начало нового блока
char *malloc( );
чтобы предупредить компилятор, что malloc( ) возвращает char. Поэтому мы присвоили значение этого starts[index] при помощи оператора
starts[index]=malloc(BLOCK);
Предположим, что мы хотим работать с int, а не char. Mожете и здесь использовать malloc( ). Вот как это делается:
char malloc( ); /* по-прежнему описываем как указатель на char */ int *newmem; newmem = (int *)malloc(100); /* используем операцию приведения типа */
Снова требуется 100 байт. Операция приведения типа преобразует значение, возвращенное char, в int. Если в системе int. занимает два байта
Другую возможность распределения calloc( ).
char *calloc( ); long *newmem; newmem=(long *) calloc(100,sizeof(long));
Функция calloc( ) возвращает char. Нужно использовать оператор приведения типа, если вы хотите запомнить другой тип. calloc( ) имеет два аргумента, и оба они должны быть целыми без знака. Первый аргумент содержит количество требуемых ячеек calloc( ) обнуляет содержимое всего блока. Ваша
Эти функции используются для:
Главными преимуществами стандартных библиотечных функций Си являются мобильность и низкие затраты на сопровождение пользовательских приложений. Библиотечные функции не подвержены частым изменениям, поэтому программы, в которых они используются, легки в сопровождении. Некоторые из этих библиотечных функций соответствуют стандарту
Стандартные библиотечные функции Си объявляются в наборе /usr/include. Опишем библиотечные функции
<stdio.h> <stdlib.h> <string.h> <memory.h> <malloc.h> <time.h> <assert.h> <stdarg.h> <getopt.h> <setjmp.h>
Кроме указанных, в большинстве UNIX-систем есть
<pwd.h> <grp.h> <crypt.h>.
В этих libc.a. Эти функции полезны для разработки приложений.
В <stdio.h> объявляется тип данных FILE, который используется в Си-программах для обозначения потоковых
| Потоковая функция или макрокоманда | Назначение |
|---|---|
fopen |
Открывает |
fclose |
Закрывает |
fread |
Читает блок данных из |
fgets |
Читает строку текста из |
fscanf |
Читает форматированные данные из |
fwrite |
Записывает блок данных в |
fputs |
Записывает строку текста в |
fprintf |
Записывает форматированные данные в |
fseek |
Перемещает |
ftell |
Возвращает текущую позицию в |
freopen |
Повторно использует |
fdopen |
Открывает потоковый |
feof |
Макрокоманда, которая возвращает ненулевое значение, если в данном |
ferror |
Макрокоманда, которая возвращает ненулевое значение, если в данном |
clearer |
Макрокоманда, которая сбрасывает флаг наличия ошибок в данном |
fileno |
Макрокоманда, которая возвращает дескриптор данного потокового |
В заголовке <stdlib.h> объявляется набор функций, служащих для преобразования данных, генерации случайных чисел, получения и установки переменных среды shell, управления выполнением программ и выполнения команд shell. Обычно эти функции объявляются в заголовке <stdio.h>, но так как они не включают в себя манипулирование
В заголовке <string.h> объявляется набор функций, предназначенных для манипулирования символьными строками.
В заголовке <memory.h> объявляется набор функций, предназначенных для манипулирования байтовым struct.
В заголовке <time.h> объявляется набор функций, предназначенных для вызова системных параметров времени. Они могут применяться для определения местного времени и даты, времени и даты в универсальном формате (UTC), а также статистических данных об использовании процессами времени центрального процессора.
В заголовке <assert.h> объявляется макрокоманда, используемая для проверки некоторых условий выполнения процесса, которые в нормальной ситуации всегда должны быть истинны. Если все же во время выполнения процесса условие не выполняется, то макрокоманда выводит сообщение об ошибке в стандартный
В заголовке <setjmp.h> объявляется набор функций, которые позволяют процессу вызывать оператор перехода goto из одной функции в другую. Вызов Си-оператора goto позволяет процессу передать управление выполнением от одного оператора к другому лишь в рамках этой же функции. Функции, определенные в заголовке <setjmp.h> устраняют данное ограничение. Эти функции необходимо использовать лишь тогда, когда без них действительно нельзя обойтись. Например, если ошибка обнаружена в рекурсивной функции, то есть смысл сообщить об ошибке, а затем выполнить оператор перехода goto в основную функцию, т.е. как бы начать процесс сначала.
В заголовке <pwd.h> определяется набор функций, предназначенных для получения учетной информации о пользователях.
В заголовке <grp.h> определяется набор функций, предназначенных для получения учетной информации о группах, содержащейся в UNIX- /etc/group.
В заголовке <crypt.h> объявляется набор функций, предназначенных для шифрования и дешифрования данных. Это очень важные функции, обеспечивающие безопасность системы. Например,
Получение getchar( ) обычно задают как stdio.h, в то время как strlen( ) обычно хранится в библиотечном
Во многих больших системах UNIX вы только компилируете программы. А
Если функция задана как #include включить ctype.h, содержащий
На некотором этапе компиляции или загрузки программы вы можете выбрать
Очевидно, мы не сможем рассмотреть все особенности всех систем, но эти три примера показывают, что вас ожидает!
Один способ организации связи программы с < и >. Этот метод прост, но ограничен. Язык Си предоставляет и более мощные методы связи с fopen( ), которая открывает fclose( ) для
struct_iobuf {
char*_ptr; /* текущий указатель буфера*/
int_cnt; /* текущий счетчик байтов*/
char*_base; /* базовый адрес буфера ввода-вывода*/
char_flag; /* управляющий признак*/
char_file; /* номер файла*/
}
#define FILE struct_iobuf /* краткая запись*/
Здесь мы не собираемся разбираться детально в этом определении. Главное состоит в том, что FILE. Многие системы используют typedef для установления этого соответствия. Таким образом, программа, имеющая дело с FILE, чтобы делать так.
Рассмотрим пример чтения содержимого File, и
#include <stdio.h>
main( )
{
FILE *in; /* описываем указатель на файл */
int ch;
if ((in = fopen("File", "r") ) != NULL) {
/* открываем File для чтения,
проверяя существует ли он */
/* указатель FILE ссылается теперь на File */
while ((ch = getc(in)) != EOF)
/* получаем символ из in */
putc(ch, stdout);
/* посылаем ch на стандартный вывод*/
fclose(in); /* закрываем файл */
}
else
printf (" Файл не открывается\"File\".\n");
}
Объясним работу: fopen( ), fclose и использование функций ввода-вывода
Функцией fopen( ) управляют три основных параметра. Первый - имя fopen( ). В нашем примере это " File ". Второй параметр описывает, как должен использоваться
" r " -
" w " -
" a " -
" w+ " - новый
" r+ " - существующий
" a+ " - w+ "можно открыть существующий r+ " в режиме " a+ " можно вести запись в конец
Некоторые системы предоставляют еще дополнительные возможности, которые мы здесь не будем рассматривать. Используемые коды являются строками, а не символьными константами. При применении " r " открывается существующий "w" для существующего файла, то старая версия его стирается, и ваша программа начинает записывать на чистое место. Третий параметр является
FILE *in;
in=fopen("File","r");
Теперь in является File ". С этого момента программа ссылается на in, а не по имени File. ( stdio.h содержит строку
FILE *fopen( )
Если fopen( ) не способна открыть требуемый NULL, определенное в stdio.h как 0.
В нашем примере показано, как нужно закрывать
fclose(in);
Аргумент функции является fclose( ) возвращает значение 0, если EOF в противном случае.
Функции fopen( ) и fclose( ) работают с fclose( ) заключается в том, чтобы освободить любые частично заполненные
Две функции getc( ) и putc( ) работают аналогично функциям getchar( ) и putchar( ) (описанным в предыдущих лекциях). Разница заключается в том, что вы должны сообщить, какой
char ch; ch=getchar( );
предназначена для получения символа от стандартного
ch=getc(in);
- для получения символа от in.
putchar(ch);
выводит символ на стандартный
putc(ch,t);
предназначена для записи символа ch в t типа FILE.
Все функции ввода-вывода, которые мы использовали в предыдущих лекциях, имеют аналоги для ввода-вывода FILE, чтобы сообщить функциям с каким getc( ) и putc( ) эти функции используются после функции fopen( ), открывающей fclose( ), закрывающей его.
Эти функции ввода-вывода работают почти как printf( ) и scanf( ) (см. лекцию 4), но им нужен дополнительный аргумент для ссылки на сам
#include <stdio.h>
main( )
{
FILE *fi;
int age;
fi=fopen("File","r"); /* считывание */
fscanf(fi,"%d",age); /* fi указывает на File */
fclose(fi);
fi=fopen("Data", "a"); /*дополнение*/
fprintf(fi,"Data is %d.\n",age);
/*fi указывает на Data*/
fclose(fi);
}
В отличие от getc( ) и putc( ) эти функции получают FILE в качестве первого аргумента.
Эта функция имеет три аргумента, в то время как gets( ) имеет лишь один. Пример ее использования:
/* Программа считывает файл строка за строкой */
#include <stdio.h>
#define MAX 80
main( )
{
FILE *f1;
char *string[MAX];
f1=fopen("File","r");
while (fgets(string,MAX,f1) != NULL)
puts(string);
}
Мы расположили вводимую информацию в символьном string. Первый из трех аргументов функции fgets( ) является MAX-1, в зависимости от того, что произойдет раньше. В любом случае нуль-символ ' \0 ' добавляется в самый конец строки. Третий аргумент указывает на gets( ) и fgets( ) заключается в том, что gets( ) заменяет символ новой строки на ' \0 ', в то время как fgets( ) сохраняет символ новой строки. Подобно gets( ) функция fgets( ) возвращает значение NULL, если встречает символ EOF
. Это позволяет нам проверить, достигли ли мы конца
Эта функция похожа на функцию puts( ). Оператор
l=fputs("Строка", fi);
| Код | Положение в |
|---|---|
0 |
начало |
1 |
текущая позиция |
2 |
конец |
Передает строку " Строка " в fi типа FILE. Конечно, сначала нужно открыть fopen( ).
l является целым числом, которое устанавливается в EOF, если fputs( ) встречает EOF или ошибку. Эта функция не ставит завершающий символ ' \0 ' в конце копируемой строки. В отличии от puts функция fputs( ) не добавляет символ новой строки в ее
Функция fseek( ) позволяет нам обрабатывать fopen( ). fseek( ) имеет три аргумента и возвращает значение типа int.
Покажем на примере работу fseek( ):
/* использование fseek( ) для печати содержимого файла */
#include <stdio.h>
int main(int number, char *names[])
{
FILE *fp; long set = 0L;
if(number<2)
puts("Введите имя файла в качестве аргумента.");
else {
if ((fp=fopen(names[1],"r")) == 0)
printf("Нельзя открыть %s\n",names[1]);
else {
while(fseek(fp, set++,0) ==0)
putchar(getc(fp));
fclose(fp);
}
}
}
Первый из трех аргументов функции fseek( ) является FILE на fopen( ). Второй аргумент " set " . Этот аргумент сообщает, как далеко следует передвинуться от начальной точки (см. ниже). Он должен иметь значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад). Третий аргумент является кодом, определяющим начальную точку.
Функция fseek( ) возвращает 0, если все хорошо, и -1, если есть ошибка. Поскольку переменная set инициализирована нулем, при первом прохождении через цикл
while(fseek(fp,set++,0)==0) putchar(getc(fp));
мы имеем выражение
fseek(fp,OL,0);
означающее, что мы идем в fp, и находим байт, отстоящий на 0 байт от начала, т.е. первый байт. Затем функция putchar( ) печатает содержимое этого байта. При следующем прохождении через цикл переменная set увеличивается до 1L, и печатается следующий байт. То есть, переменная set действует подобно индексу для элементов set не попытается попасть в fseek( ) после конца fseek( ) возвращает значение -1 и цикл прекращается.
Пусть нам нужно распределить
char str[ ] = "Символьная строка";
Будет выделена
int mas[150];
Это описание выделяет 150 ячеек malloc( ). И без
/* добавляем память, если необходимо */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STOP "\n" /* сигнал прекращения ввода */
#define BLOCK 100 /*байты памяти */
#define LIM 40 /*предельная длина вводимой строки*/
#define MAX 50 /*максимальное число вводимых строк */
#define TIME 20000 /* большая задержка времени */
main ( )
{
char store[BLOCK]; /* исходный блок памяти*/
char symph[LIM]; /* приемник вводимых строк*/
char *end; /* указывает на конец памяти */
char *starts[MAX]; /* указывает на начала строк*/
int index = 0; /*количество вводимых строк */
int count; /* счетчик*/
char malloc( ); /* распределитель памяти */
starts[0]=store;
end=starts[0]+BLOCK-1;
puts("Вводите строки по одной");
puts("для завершения ввода в начале строки нажимите клавишу [ввод]");
puts("Начинайте!.");
while(index<MAX) {
if(fgets(symph,LIM,stdin))
if (strcmp(fgets(symph,LIM,stdin),STOP) == 0)
break;
if(strlen(symph)>end - starts[index]) {
/* действия при недостатке памяти для
запоминания вводимых данных*/
puts("подождите, программа попробует найти дополнительную память");
starts[index]=malloc(BLOCK);
end=starts[index]+BLOCK- 1;
for(count=0; count<TIME; count++);
puts("память найдена");
}
strcpy(starts[index],symph);
starts[index+1]=starts[index] + strlen(symph)+1;
if(++index<MAX)
printf("Строка: %d. продолжайте.\n", index);
}
puts("Вывод программы");
for(count=0; count<index; count++)
puts(starts[count]);
}
Давайте посмотрим, что делает функция malloc( ). Она берет аргумент в виде целого без знака, которое представляет количество требуемых байтов malloc(BLOCK) требует 100 байт. Функция возвращает char в начало нового блока
char *malloc( );
чтобы предупредить компилятор, что malloc( ) возвращает char. Поэтому мы присвоили значение этого starts[index] при помощи оператора
starts[index]=malloc(BLOCK);
Предположим, что мы хотим работать с int, а не char. Mожете и здесь использовать malloc( ). Вот как это делается:
char malloc( ); /* по-прежнему описываем как указатель на char */ int *newmem; newmem = (int *)malloc(100); /* используем операцию приведения типа */
Снова требуется 100 байт. Операция приведения типа преобразует значение, возвращенное char, в int. Если в системе int. занимает два байта
Другую возможность распределения calloc( ).
char *calloc( ); long *newmem; newmem=(long *) calloc(100,sizeof(long));
Функция calloc( ) возвращает char. Нужно использовать оператор приведения типа, если вы хотите запомнить другой тип. calloc( ) имеет два аргумента, и оба они должны быть целыми без знака. Первый аргумент содержит количество требуемых ячеек calloc( ) обнуляет содержимое всего блока. Ваша
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.