
- •1. Лабораторная работа №1
- •1.1. Методическая часть Оператор if
- •Конструкция if-else
- •If (условное выражение)
- •Множественный выбор
- •If (условное выражение)
- •Множественный выбор - оператор switch
- •Операторы цикла
- •1.2. Порядок выполнения работы.
- •1.3. Варианты заданий
- •1.4. Контрольные вопросы
- •2.1. Методическая часть Функции. Аргументы функции.
- •2.2. Порядок выполнения работы.
- •2.3. Варианты заданий
- •2.4. Контрольные вопросы
- •3.1. Методическая часть Массивы как аргументы функции
- •Функции и многомерные массивы
- •3.2. Порядок выполнения работы.
- •3.3. Варианты заданий
- •3.4. Контрольные вопросы
- •4.1. Методическая часть Символьные строки
- •Строковые константы
- •Массивы типа char и их инициализация
- •Явное задание размера памяти
- •Массивы символьных строк
- •Указатели и строки
- •Ввод строк
- •Функция gets()
- •Функция scanf()
- •Функция puts()
- •Функции, работающие со строками Функция strcat() - string catenation
- •Функция strcmp() - string comparison
- •Функция strcmpi()
- •Функция strncmp()
- •Функция strcpy()
- •Функция strncpy()
- •Пример реальной программы сортировки строк
- •4.2. Порядок выполнения работы.
- •4.3. Варианты заданий
- •4.4. Контрольные вопросы
Явное задание размера памяти
Иной путь выделения памяти заключается в явном задании. Во внешнем описании можно записать: char str[10]= “Кто вы”;
вместо char str[]= “Кто вы”;
Можно быть уверенным, что число элементов по крайней мере на один больше, чем длина строки. Как и в других статических и внешних массивах, любые неиспользуемые элементы автоматически инициализируются нулем.
Массивы символьных строк
Часто бывает удобно использовать массивы символьных строк. В этом случае может быть использован индекс для доступа к строкам. Покажем это на примере:
static char *mas[5]={"Слива","Арбуз","Яблоко","Дыня","Груша"};
Можно сказать, что mas является массивом, состоящим из пяти указателей на символьные строки. Каждая строка символов представляет символьный массив, поэтому у нас есть пять указателей на массивы. Первым указателем является mas[0], и он ссылается на первую строку. Второй указатель mas[1] ссылается на вторую строку. Каждый указатель ссылается на первый элемент строки.
*mas[0]=='c' *mas[1]=='а' *mas[2]=='я'
Инициализация выполняется по правилам, определенным для массивов. Тексты в кавычках эквивалентны скобочной записи
{ {....},{.....},.....,{.....} };
где многоточия подразумевают приведенные тексты. Кроме того, мы могли бы явно задать размер строк символов, используя описание, подобное следующему:
static char mas[5][7];
Разница заключается в том, что второй индекс задает прямоугольный массив, в котором все ряды (строки) имеют одинаковую длину. Описание
static char *mas[5];
определяет "рваный" массив, где длина этого ряда определяется той строкой, которая этот ряд инициализировала. Рваный массив не тратит память впустую. Ниже показано представление данных в прямоугольном и рваном массивах.
Слива\0\0 Слива\0
Арбуз\0\0 Арбуз\0
Яблоко \0 Яблоко\0
Дыня\0\0\0 Дыня\0
Груша\0\0 Груша\0
Указатели и строки
Большинство операций языка СИ, имеющих дело со строками, работают с указателями. В качестве примера рассмотрим программу:
main()
{ static char *mesg="Пример";
static char *copy;
copy=mesg;
printf("%s\n",copy);
printf("%s %u %u \n", mesg,mesg,&mesg);
printf("%s %u %u \n", copy,copy,©);
}
Результат: Пример
Пример 3546 1832
Пример 3546 1561
В нашем примере строка с указателем mesg не копируется, а оператор copy=mesg создает второй указатель на ту же строку.
Ввод строк
Процесс ввода строк выполняется за два шага: выделение памяти для запоминания строки и применение функции ввода для получения строки.
Сначала следует определить место для размещения строки при вводе, т.е. выделить память, достаточную для размещения любых строк, которые мы предполагаем считывать. Не следует надеяться, что компьютер сам подсчитает длину строки и выделит под нее память. Если вы в программе напишете следующее
static char *name;
scanf("%s", name);
компилятор, вероятнее всего, не обнаружит в этом тексте ошибки. Однако ошибка может проявиться в процессе выполнения программы. При вводе данных имя будет вводиться в ячейки памяти, которые содержат уже команды программы или данные, что может привести к непредсказуемым результатам.
Для исключения подобных ошибок необходимо указать явный размер массива или воспользоваться библиотечными функциями языка СИ для выделения динамической памяти.
Как только выделена память для массива, можно считывать строку. Мы уже упоминали, что ввод-вывод в С выполняется с помощью подпрограмм-функций, а не входит в состав языка. В библиотеку программ ввода-вывода входит несколько десятков функций, в число которых входят функции scanf() u gets(), которые могут считывать строки. Обратите внимание, что аргументом этих функций, указывающим, куда вводить-выводить строку (формат %s), должен быть указатель.