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

Занятие 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() возвращает число байт выводимой на экран информации.