Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С(часть1-3).doc
Скачиваний:
23
Добавлен:
12.02.2015
Размер:
854.02 Кб
Скачать

Int strcmp(const char *str1, const char* str2);

Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее от результата сравнения следующим образом: значение меньше нуля, если str1<str2; ноль, если str1=str2; больше нуля, если str1>str2. Приведем пример использования этой функции – фрагмент программы, проверяющий упорядочены ли два слова по алфавиту:

char s1[20], s2[20];

scanf("%s%s",s1,s2);

int k=strcmp(s1,s2);

if (k<0) printf("Слова упорядочены по алфавиту");

else if (k==0) printf("Слова одинаковы");

else printf("Слова не упорядочены по алфавиту");

3

#include <string.h>

char * strcpy (char *str1, const char* str2);

Функция strcpy() копирует содержимое строкиstr2 в строкуstr1 и возвращает значение указателяstr1. Если заданные символьные массивы перекрываются, поведение функции не определено. Приведем пример использования этой функции – ввести в клавиатуры слово и скопировать его в новую строку.

char str1[20],str2[20];

scanf("%s%s",str1, str2);

strcpy(str2,str1);

printf("%s%s%s", str1,"\n",str2);

Пример. Вывести слова введенной строки, начинающиеся с гласной буквы, на экран столбиком, без разделительных знаков (пробел, табуляция, точка, запятая и т.п.).

Для выделения слов из строки будем использовать библиотечную функцию

char * strtok(char *str1, const char *str2),

которая ищет в строке str1 лексемы, выделенные символами из строки str2 и возвращает указатель на выделенную лексему, причем при отсутствии лексемы возвращается NULL (нулевой указатель, то есть указатель, отличный от указателя на любой объект). Чтобы разделить некоторую строку на лексемы, при первом вызове функции strtok() параметр str1 должен указывать на начало этой строки. При последующих вызовах функции в качестве параметра str1 нужно использовать нулевой указатель.

Для проверки принадлежности первой буквы слова к гласным буквам будем использовать функцию

char * strchr (const char * str, int ch),

которая возвращает указатель на первое вхождение младшего байта параметра ch в строке str. Если совпадение не обнаружено, возвращается нулевой указатель.

# include <stdio.h>

# include <conio.h>

# include <string.h>

# define dlin 80 // директива позволяет в программе вместо

//числа 80 использовать идентификатор dlin

Void main()

{

printf("Enter string: ");

char stroka[dlin];

gets(stroka);

char *slova[dlin/2]; //массив указателей для хранения

//слов строки

char *razd=".,:;!? ";// указатель на строку,

//состоящую из разделительный символов

char *glas="aeoiuy"; // указатель на строку,

//состоящую из гласных

int k=0; //определили индекс для массива slova

slova[k]=strtok(stroka,razd); // выделили первое слово

while (slova[k])// пока выделенная из строки

//лексема не равна NULL

{

if (strchr(glas,*slova[k])!=NULL)

printf("%s%s",slova[k],"\n");//проверили, является ли первая

// буква слова s1[k] гласной

slova[++k]=strtok(NULL,razd); // выделили очередное

//слово.

}

getch();

}

В данном решении задачи для хранения слов мы использовали массив, взяв за его размерность максимально возможную – размерность исходной строки, деленную пополам, то есть предполагая, что все слова строки состоят из одной буквы и разделены одним разделителем. Однако, в данной задачи не предполагается дальнейшая обработка выделенных из строки слов, поэтому нет необходимости сохранять их в массиве. Поэтому целесообразнее определять массив указателей char * s1[dlin/2], а определить лишь один указательchar*s1, который и использовать для обработки очередного выделенного слова.

Функции для работы с файлами описаны в заголовочном файле stdio.h.([8] стр. 131).В языке не предусмотрены никакие предопределенные структуры фалов: все файлы рассматриваются как последовательности, потоки байтов. Для файла определен маркер (указатель чтения/записи), который определят текущую позицию, к которой осуществляется доступ. В программе возможно открывать потоки ввода–вывода и связывать их либо с файлами на диске либо с физическими устройствами (например, принтером), записывать в них или считывать из них информацию. Доступ к потоку осуществляется с помощью типаFILE, определенного в файлеstdio.hследующим образом:

FILE * идентификатор;

Описанный указатель можно связывать с конкретным файлом в момент открытия данного файл. Это осуществляется с помощью функции

FILE * fopen(const char *fname, const char * mode);

Функция fopen() открывает файл, имя которого задает параметр fname и возвращает поток, связанный с этим файлом. Строка fname должна представлять собой имя файла, которое разрешено определенными в данной операционной системе правилами. Если указанный файл не удается открыть, функция возвращает нулевой указатель. Типы операций, которые разрешено выполнять с файлом, определяются параметром mode. Существует таблица значений параметра mode. Наиболее часто используемые значения:

“r” – открывает текстовый файл для чтения;

“w” – создает текстовый файл для записи;

“a” – открывает текстовый файл для записи в конец файла;

“r+” – открывает текстовый фал для чтения и записи;

“w+” – создает текстовый файл для чтения и записи;

“a+” – открывает текстовый файл для чтения и записи в конец файла.

Приведем фрагмент программы, иллюстрирующий корректный способ открытия файла.

FILE *fp=fopen("1.txt","r");

if (fp==NULL) {printf("Не удается открыть файл "); exit(1);}

else {….}

В данном примере происходит попытка открыть файл с именем “1.txt” в текущем каталоге для чтения. Если такого файла не существует, на экран выдается соответствующее сообщение и с помощью функцииexit(), описанной в заголовочном файлеstdlib.h, происходит завершение программы. При открытии файла для записи с параметром “w” также рекомендуется делать проверку, так как диск может быть защищен от записи или заполнен.

По окончании работы с файлом он должен быть закрыт с помощью функции