- •Оглавление
- •Занятие 6. Функции.
- •Прототип функции
- •Определение функции
- •Аргументы и параметры функции
- •Функции с переменным числом параметров
- •Рекурсивные функции
- •Математические функции
- •Передача массивов как параметров
- •Передача многомерных массивов как параметров
- •Использование указателей при работе с функциями
- •Перегрузка функций
- •Занятие 7. Коллоквиум.
- •Занятие 8. Строки Указатели и строки
- •Функции ввода, вывода строк
- •Стандартные функции обработки строк
- •Занятие 9. Директивы препроцессора.
- •Директива #include
- •Директива #define
- •Директивы условной компиляции #if, #elif, #else и #endif
- •Директива #undef
- •Макроопределения с параметрами
- •Занятие 10.
- •Занятие 11.
- •Занятие 12.
Занятие 7. Коллоквиум.
Готовьтесь к коллоквиуму! Удачи!
Занятие 8. Строки Указатели и строки
При работе со строками часто используются указатели. Cтрока представляет собой массив символов, заканчивающийся нуль-символом (‘\0’). По положению нуль-символа определяется фактическая длина строки.
Пример, иллюстрирующий применение указателей в работе со строками.
Инициализировать строку, объявить два указателя на строки, инициализировать один из них адресом заданной строки, присвоить значение первого указателя второму. Напечатать строку, на которую указывают оба указателя, и их значения. Напечатать первый и седьмой символ строки.
#include <stdio.h>
#define PRNT(X) printf(“X=%s; &X=%p\n”, X, &X)
int main()
{
char *text=”Не делай глупостей”, *copy;
copy=text; /* Указатель copy теперь указывает на ту же строку */
printf(“%s\n”, copy);
/* Cтрока – это массив символов, copy – указатель на первый символ массива */
/* Печать первого символа строки (форматная спецификация %с) */
printf(“Первый символ строки: %c \n”, * copy);
/* Печать седьмого символа строки, copy+6 – указатель на седьмой символ */
printf(“Седьмой символ строки: %c \n”, *( copy+6));
PRNT(text);
PRNT(copy);
}
Пояснения.
В программе строка text инициализируется строковой константой ”Не делай глупостей”. Так как любая строка – это массив символов с замыкающим нуль-символом, то можно было бы инициализировать ее и как символьный массив с нуль-символом (‘\0’) в конце:
сhar *text={‘Н’,’е’,’ ‘,’д’,’е’,’л’,’а’,’й’,’ ,’г’,’л’,’у’,’п’,’о’,’с’,’т’,’е’,’й’,’\0’};
Правда, такой метод инициализации утомителен и чреват ошибками. Без замыкающего нуль-символа мы получаем массив символов, а не строку, и не можем использовать функции работы со строками.
Функции ввода, вывода строк
1. Функции ввода строки gets() и scanf()
Чтобы ввести строку символов, необходимо сначала в программе зарезервировать память под вводимую строку. Это проще всего сделать, явно задав размер символьного массива ( например, char array[81] ). Функция gets(char *) читает вводимые с клавиатуры символы до тех пор, пока не встретит символ новой строки (‘\n’), который создается при нажатии клавиши [ввод]. Функция берет все символы до ( но не включая ) символа новой строки, присоединяет к ним нуль-символ (‘\0’) и возвращает указатель на введенную строку вызывающей программе.
Пример использования функции gets() для ввода строки.
Ввести строку символов, вывести ее на экран, вывести пятый символ строки. Для доступа к символам строки использовать указатели.
#include <stdio.h>
int main()
{
char text[81], *ptext;
printf(“Введите строку символов (<=10)”);
ptext=gets(text);
printf(“%s \n %s \n”, text, ptext);
printf(“%c \n %c \n”, text[5],*( ptext+5));
}
Для функции scanf() строка начинается с первого непустого введенного символа. Если строка вводится по формату %s, то строка продолжается до ( но не включая ) следующего пустого символа (пробел, табуляция, новая строка ). Функция scanf() возвращает целое значение, равное числу считанных по форматной спецификации %s строк, если ввод прошел успешно.
Пример использования функции scanf() для ввода строки.
Ввести 2 строки символов, вывести их на экран.
#include <stdio.h>
int main()
{
char text1[81], text2[81];
int number;
printf(“Введите 2 строки символов (<=10) через пробел ”);
number=scanf(“%s %s”,text1, text2);
printf(“Функция scanf() считала %d строки: “ %s” и “%s” \n”,
number, text1, text2);
}
2. Функции вывода строк puts() и printf().
Функция puts(char *) очень простая, у нее только один аргумент – указатель на строку. Функция выводит на экран все символы строки, пока ей не встретится нуль-символ. Если с помощью этой функции попытаться вывести на экран массив символов без завершающего нуль-символа, то функция станет перебирать все ячейки памяти, чтобы найти его и остановить свою работу. Хорошо, если найдет. Иначе ей придется работать вечно. Любая строка, выводимая с помощью функции puts(), печатается с новой строки. В вызывающую программу puts() возвращает неотрицательное число.
Пример использования функции puts() для вывода строки.
#include <stdio.h>
int main()
{
char text1[]=”Массив инициализирован этой строкой.”;
char *ptext2=”Указатель инициализирован этой строкой.”;
puts(“Любая строка легко печатается с помощью puts().”);
puts(text1); puts(ptext2);
puts(ptext2+3); // Печать строки начнется не с первого символа, а с четвертого
puts(&text1[4]); // Печать строки начнется с пятого символа
}
Функция printf() менее удобна, чем puts(), но более гибка. Она тоже использует указатель строки в качестве аргумента, но не выводит автоматически каждую строку текста с новой строки. Зато printf() легко объединяет строки для печати в одну строку. В вызывающую программу printf() возвращает число байт выводимой на экран информации.