Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

98

Пример 1. Определение длины строки.

Задачу решается так. Настроим рабочий указатель на начало строки, затем запустим цикл, который переставит указатель на конец строки (см. схему). Тогда разность между рабочим указателем (рt), который после окончания цикла будет установлен на последний символ строки ('\0'), и указателем на начало строки (st) равна длине строки. Ниже приведена программа, реализующая описанный алгоритм.

// Программа для вычисления длины введенной строки

#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 17

void _tmain()

{

char str[SIZE],*pt; int len;

cout << "Введите строку\n"; cin >> str;

pt = str; // Установка рабочего указателя на начало строки

while(*pt++); // Перестановка рабочего указателя на конец строки

len = pt - str; // Длина строки = разность указателей

99

cout << "\n Длина строки = " << len; _getch();

}

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

Получаемая в этой программе длина строки учитывает наличие символа конца строки ('\0'), т.е. "пустая" строка имеет длину 1. (Стандартная функция для получения длины строки (strlen) возвращает длину без учета символа конца строки). Ввод строки с помощью операции cin допускает только ввод текста, не содержащего пробела. Ввод строк с пробелами см. в параграфе «Чтение файла в матрицу».

То, что в программе в длине строки учитывается символ '\0', позволяет понять принцип выполнения операторов вида *pt++. При такой записи сначала берется значение по текущему адресу и только после этого увеличивается значение указателя, т.е. наращивание указателя (переход к адресу следующего символа строки) происходит, когда программа "покидает" вычисление выражения. Другими словами, сначала проверяется значение символа по текущему адресу, а после выполнения проверки указатель настраивается на следующий элемент, т.е. при выходе из цикла указатель настроен на символ за концом строки. Поскольку указатель на первый символ имеет смещение от начала строки 0 (вместо 1), то это и обеспечивает требуемое увеличение длины на 1.

Пример 2. Копирование одной строки в другую

Для решения задачи должны быть описаны две строки и два рабочих указателя. Исходная строка в примере названа sts, строка, в которую будет производиться копирование, названа std.

100

Для копирования последовательно с начала строки sts считывают по одному символу и переписывают в строку std. Окончание процесса копирования определяется по символу конца исходной строки

('\0').

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

Ниже приведена программа, реализующая описанный алгоритм.

// Копирование строк

#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 17

void _tmain() {

char sts[SIZE],std[SIZE],*pts,*ptd; cout << "Введите строку\n"; cin >> sts;

pts = sts; ptd = std; // Настройка рабочих указателей while(*ptd++ = *pts++); // Собственно копирование

cout << "\n После копирования строка = " << std; _getch();

}

101

Отметим, что для этого примера некоторые компиляторы выдают предупреждение о "возможно неправильном присваивании" из-за того, что в условии окончания цикла записана операция присваивания, а не сравнения. Для исключения этого предупреждения следовало бы записать:

while((*ptd++ = *pts++) != '\0');

Но работает программа правильно.

Пример 3. Исключение из строки символа.

Для исключения должна быть задана позиция (место) символа в строке. Номер позиции в программе отсчитывается от 0 (т. е будем считать, что начальный символ строки имеет номер 0), а пользователю удобно отсчитывать позиции в строке от 1. Это будет учтено в программе.

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

Из схемы видно, что для исключения из строки символа следует переписать часть строки, находящуюся после исключаемого символа, в эту же строку со сдвигом влево на одну позицию. Таким образом, исключение из строки символа сводится к операции копирования одной части строки в другую со смещением. Отличие же от обычной операции копирования заключается в настройке рабочих указателей.

102

Вприведенной ниже программе исключения из строки символа указатель qt настраивается на исключаемый символ. В выражении с указателем позиция исключения (w) уменьшена на 1 из-за несовпадения внешней нумерации символов (удобной для человека) с нумерацией в программе. Указатель pt настраивается на символ, следующий за исключаемым (указатель pt смещен на одну позицию вправо относительно указателя qt). После этого стандартным способом выполняется копирование.

Впрограмме также выполнена проверка номера позиции исключаемого символа, чтобы он не оказался на конце строки (фактической или объявленной) или за ее пределами. Длина строки определяется

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

Ниже приведена программа, реализующая описанный алгоритм.

// Исключение из строки символа.

#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 80

void _tmain()

{

char st[SIZE],*pt, *qt; int w;

cout << "Введите строку \n"; cin >> st;

cout << "Введите номер позиции \n"; cin >> w;

if (w < strlen(st) && w < SIZE - 2 && w > 0)

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