Ваша библиотека языка Си, вероятно, предоставляет несколько других функций управления памятью, и вы можете захотеть проверить их.
ДРУГИЕ БИБЛИОТЕЧНЫЕ ФУНКЦИИ
Большинство библиотек будут выполнять и ряд дополнительных функций в тех случаях, которые мы рассмотрели. Кроме функций, распределяющих память, есть функции, освобождающие память после работы с нею. Могут быть другие функции, работающие со строками, например такие, которые ищут в строке определенный символ или сочетание символов.
Некоторые функции, работающие с файлами, включают ореn( ), close( ), create( ), fseek( ), read( )и write( ). Они выполняют почти те же самые задачи, что и функции, которые мы обсудили, но на более фундаментальном уровне. Действительно, функции, подобные fopen( ), обычно пишутся с применением этих более общих функций. Они немного более трудны в использовании, но могут работать с двоичными файлами так же, как и с текстовыми.
Ваша система может иметь библиотеку математических функций. Обычно такая библиотека будет содержать функции квадратного корня, степенные, экспоненциальные, различные тригонометрические функции и функцию получения случайных чисел.
Вам нужно время, чтобы освоить то, что предлагает наша система. Если у нее нет того, что вам нужно, создайте свои собственные функции. Это часть языка Си. Если вы полагаете, что можете улучшить работу, скажем, функции ввода, сделайте это! А когда вы усовершенствуете и отшлифуете свои методы программирования, вы перейдете от обычного языка Си к блестящему языку Си.
Мы прошли долгий путь от начала этого руководства. Теперь вы уже познакомились с большинством основных свойств языка Си. (Главное из того что, мы опустили,- операции с разрядами и расширения UNIX 7 - рассматриваются кратко в приложении Б). Вы узнали и использовали все изобилие его операторов, огромное разнообразие основных и производных типов данных, его "умные" управляющие конструкции и мощную систему указателей. Мы надеемся, что подготовили вас к использованию языка Си в ваших собственных целях. Поэтому начинайте программировать, и удачи вам!
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Что такое библиотека языка Си и как ее использовать.
Как открывать и закрывать текстовые файлы: fopen( )и fclose( )
Что такое тип FILE
Как читать из файла и записывать в файл: getc( ), putc( ), fgets( ), fputs( ), fscanf( ), fprintf( )
Как проверять классы символов: isdigit( ), isalpha( )и т. д.
Как превращать строки в числа: atoi( )и atof( )
Как осуществлять быстрый выход: exit( )
Как распределять память: malloc( ), саllос( )
1. Что неправильно в этой программе?
main( )
{ int *fp;
int k;
fp = fopen("желе");
for(k = 0; k < 30; k++)
fputs(fp, "Нанетта ест желе.");
fclose("желе");
}
2. Что будет делать следующая программа?
#include
#include
main(argc, argv)
int argc;
char *argv[ ];
{ int ch;
FILE *fp;
if((fp=fopen(argv[1], "r")) == NULL)
exit(1);
while((ch=getc(fp)) != EOF)
if(isdigit(ch))
putchar(ch);
fclose (fp);
}
3. Вce ли правильно в выражении isalpha(c[i]), где сявляется массивом типа char. Что можно сказать о isalpha(c[i ++])?
4.Используйте функции классификации символе" для подготовки выполненния atoi( ).
5. Как вы могли бы распределить, память для размещения массива структур?
1. Должна быть директива #include для определения ее файлов. Следует описать указатель fpфайла: FILE *fp;функция fopen( )должна иметь вид fopen("желе", "w"), или, может быть, включать " а" . Порядок аргументов в fputs( )должен быть обратным. Функция fclose( )требует указателя файла, а не имени файла: fclose(fp).
2. Она будет открывать файл, заданный как аргумент командной строки, и выво дить на печать все цифры в файле. Программа должна проверять (но не делает этого), не аргумент ли это командной строки.
3. Первое выражение правильно, так как с[i]имеет значение типа char. Второе выражение не выводит компьютер из строя, но может давать непредсказуемый результат. Причина в том, что isalpha( )является макроопределением, у которого, по всей вероятности, аргумент появляется дважды в определяющем выражении (проверка на принадлежность к регистру строчных букв, а зачем - прописных букв) и это дает в результате два увеличения i. Лучше всего избегать использования оператора увеличения в аргументе макрофункции.
Читать дальше