Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть 2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
367.1 Кб
Скачать

Контрольные вопросы

  1. Что такое указатель и каким образом он описывается в программе?

  2. Какими данными характеризуется указатель?

  3. Перечислите все возможные способы инициализации указателей.

  4. Зачем используется функция malloc и каков ее формат?

  5. В чем состоит отличие указателя от имени массива?

  6. Каким образом в матрице можно определить адрес любой строки?

  7. Каким образом осуществляется работа со столбцами матрицы через операцию типа указатель?

Варианты заданий

Выполнить соответствующий вариант лабораторной работы № 9, используя операцию типа указатель.

Лабораторная работа № 11

Символьные строки

Цель работы

Изучение операций над символьными строками.

Строки – это последовательность символов, заключенная в кавычки. Строка соответствует типу данных "массив символов". Она может содержать любые определенные в конкретной реализации языка символы. В конце строки компилятор добавляет нулевой символ, который служит признаком конца строки.

Каждая пара соседних строк трактуется как строка, состоящая из всех знаков первого литерала (так иногда называют строки) и следующих после них всех знаков второго (второй строки). Таким образом, например, запись "Hello" " " "World" трактуется как запись "Hello World".

Строки можно описать в программе тремя способами. Для иллюстрации этих способов, а так же принципов вывода массивов приведем пример.

/* программа, иллюстрирующая описания и вывод строковых литералов */

^include <stdio.h>

char mesl[50] = "1 love you."; /* 1-ый способ */

char mes2[ ] = "I love you."; /* 2-ый способ */

char *те$3 = "I love you."; /* 3-ый способ */

main()

{

char mes4 = "I love you";

/* печать фразы "I love you" */

printf( "\nmesl=%s",mesl );

printf ( "\nmes2=%s",mes2 );

printf ( "\nmes3=%s",mes3 );

printf( "\nmes4=%s\n",mes4 );

}

Строка является первичным выражением, которое имеет тип ( char[ ] ), но аналогично идентификатору, который представляет имя массива, трактуется как указатель на элемент типа (char).

Пример:

char ewa[ ] = "abcde", *jan ="abcde";

Литерал "abcde" при инициализации переменной ewa образует удобное сокращение от {'a','b','c'.'d','e','\0'}.

Таким образом, строки - это символьные массивы, последний элемент которых '\0'. Имя массива является константой - указателем, ссылающимся на начальный адрес данных, которые обычно занимают множество последовательных ячеек памяти. Этот адрес определяется компилятором в момент описания массива, и такой адрес не может быть переопределен. В связи с этим нельзя осуществить присваивание массивов по их имени.

Пример.

Пусть задан фрагмент программы вида :

int first[10],second[10];

second = first;

В этом фрагменте нельзя осуществить присваивание second == first, так как указатель на массив second – константа. Это означает, что в Турбо Си такое действие непосредственно нельзя сделать.

Литерал "abcde" при инициализации указателя jan дает указать на первый знак строки, состоящей из знаков abcde и знака нуль.

Отметим, что если строки задаются в виде литералов, то компилятор автоматически добавляет в конце строки нулевой символ. Если же строка формируется символ за символом, то ответственность за окончание строки лежит на самом программисте:

mystr[0]='C';

mystrtlj-'A';

mystr[2]="T;

mystr[3]='\0';

Вывод строки на экран осуществляется аналогично символьным массивам. Ниже приводятся два примера вывода некоторой строки.

char *Ptr = "abcde";

#include <stdio.h>

void main ()

{ do

printf ("%с",*Рtг);

while (*++Ptr);

return 0;

}

Можно организовать вывод строки abcde несколько по-другому.

#include <stdio.h>

void main ()

{ for(Ptr =”abcde",*Ptr)

printf("%c",*Ptr++);

return 0;

}

Строки можно выводить и по шаблону S.

Другим средством ввода-вывода строк служат функции gets и puts. Функции gets и puts предназначены для получения строки из потока stdin и записи строки в поток stdout. Их прототипы находятся в файле stdio.h и имеют вид :

char *gets (char *string);

int puts (char *string);

Отметим, что помимо этих функций в библиотеке в файле conio.h приведены еще другие функции, позволяющие решать аналогичные задачи. Это функции cgets,fgets,cputs,fputs.

При написании программ, содержащих операции со строками целесообразно использовать функции стандартной библиотеки языка Си.

Все прототипы функций работы со строками содержатся в файле string.h. Все эти функции работают со строками, завершающимися нулевым байтом (\0).

Ниже приводятся прототипы функций strcat, strchr, strcpy, strcspn, strdup, используемых при работе со строками. Прототипы этих функций приведены ниже. #include <string.h>;

char *strcat (char *stringl , char *string2);

char *strchr (char *string, int sim);

int strcmp (char * string1, char * string2);

char strcpy (char * string 1, char *string2);

int strcspn (char*stringl , char *string2);

char strdup (char *string;);

Функция strcat соединяет две строки, возвращая указатель на первый символ string].

Функция strchr возвращает указатель на первое вхождение символа, задаваемого кодом sim. Если символ не найден, то функция возвращает null.

Функция strcmp сравнивает две строки и возвращает значение, определяющее их соотношение.

Функция strcpy копирует строку, адрес которой определяется значением аргумента string2, включая и завершающий символ, по адресу, определяемому stringl.

Функция strcspn возвращает индекс первого символа в строке stringl, который принадлежит набору символов, содержащихся в строке string2, т. е. осуществляет поиск подстроки в строке.

Функция strdup возвращает указатель на область памяти, куда скопирована строка. Если же не удалось выделить память, то она возвращает значение NULL.

Приведенный ниже фрагмент программы иллюстрирует основные операции со строками.

# include <string.h>

char string [100], template [100], *result;

int numresult;

/* собирается строка "computer program" */

strcpy (string, “computer”);

result=strcat( string, "program");

/* найдем первое вхождение 'а' в строке */ result = strchr( string, 'a');

/'* определим, какая из строк string или template больше, меньше или равна другой */

numresult=strcmp( string, template);

/'* заметим, что заглавные буквы и строчные буквы при этом

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

strcmpi */

/'* сделаем копию строки */ result = strcpy (template,string);

/* проведем поиск символов а,b,с, в строке */'

strcpy ( string,"xyzabbc");

result = strcspn (string, "abc");

/'* продублируем строку, сделав новый указатель */ result = strdup( string);

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]