Программа 20. Представления символов

В программе выводится значение выражения int('A'), которое равно коду латинской буквы A. Кроме этого, выводится изображение данной буквы с использование трех представлений: ’A’, ’\x41’ и ’\101’, а также как значение символьной переменной c.

// Файл PresChar.cpp

// Использование символьных констант и переменных

#include <iostream.h>

#include <conio.h>

int main()

{

char c = 'A';

cout << "Код: " << int('A') << ", Символ: " << 'A'

<< ',' << '\x41' << ',' << '\101' << ',' << c;

getch();

return 0;

}

Данная программа выдает:

Код: 65, Символ: A, A, A, A

Таким образом, константы ’A’, ’\x41’, ’\101’ имеют одинаковое числовое значение 65, равное коду латинской A в кодовой таблице.

Ввод и вывод символов

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

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

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

С помощью клавиатуры признак конца входного потока формируется одновременным нажатием двух клавишCtrl+Z.

Для вывода одиночного символа можно использовать функцию put(char c), которая выводит в поток свой аргумент. При выводе в стандартный выходной поток cout символа c вызов данной функции должен иметь вид cout.put(c).

В программе 21 демонстрируется использование данных функций.

Программа 21. Печать текста по словам

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

1) пропустить пробельные символы;

2) прочитать и вывести символы слова;

3) перейти на новую строку выходного потока.

// Файл TxtWords.cpp

#include <iostream.h>

#include <conio.h>

// Каждое слово вводимого текста печатается на отдельной строке

int main()

{

char c;

while(!cin.eof()){ // Пока не исчерпан входной поток,

c = cin.get(); // читаем символы из потока

while(c == ' ' || c == '\n' || c == '\t') // Пока c - пробельный символ,

c = cin.get(); // читаем следующий

// Чтение и печать символов слова

while(!cin.eof() && c != ' ' && c != '\n' && c != '\t'){ // Пока c не пробел

cout. put(c); // Печать очередного символа

c = cin.get(); // Чтение очередного символа

}

cout.put('\n'); // Переход к новой строке, когда закончилось слово

}

getch();

return 0;

}

Для размещения текущего символа использована переменная c типа char.

Внешний цикл while выполняется, если во входном потоке есть символы, что проверяется с помощью вызова функции cin.eof(). Знак ! обозначает оператор логического отрицания, поэтому, если конец входного потока не достигнут, eof() возвращает 0 (ложь), отрицание даст 1 (истина), и цикл будет выполняться.

Внутри внешнего цикла сначала читается очередной символ. Первый из двух внутренних циклов while предназначен для пропуска пробельных символов. Пробельными символами считаются собственно пробел ’ ’, табуляция ’\t’ и новая строка ’\n’. Используется оператор == сравнения на равенство, результаты сравнения соединяются логическим оператором ИЛИ, обозначаемым ||.

Второй внутренний цикл выполняется, пока очередной символ не является пробельным и не достигнут конец входного потока. Используется оператор сравнения на неравенство != и логический оператор И, обозначаемый &&.

Далее приводится пример работы программы.

Когда б имел златые горы^Z

Когда

б

имел

златые

горы

Для ввода признака конца входного потока нажимается комбинация Ctrl+Z, что приводит к появлению на экране ^Z.

Строки символов

Строки символов широко используются в программировании, так как общение пользователя с программой ведется, в основном, с помощью текстовых сообщений, состоящих из отдельных строк. Строка в языках Си и C++ – это массив символов, ограниченный признаком конца строки, которым служит символ ’\0’ с нулевым кодом, например, массив s, определенный инструкцией:

char s[100];

может содержать строку длиной от 0 до 99 символов, так как из 100 байтов, выделенных под массив, один байт занимает признак конца строки ’\0’. Данный символ может занимать любую позицию в массиве, поэтому в массиве фиксированного размера могут располагаться строки различной длины. Если s[0] = ’\0’, то массив s содержит строку нулевой длины, иначе говоря, пустую строку.

Строковые константы

Строковая константа представляется в тексте программы последовательностью произвольных символов, заключенной в двойные кавычки. Под строковые константы в памяти выделяется массив, в котором располагаются все символы строки и признак конца, например, для строки ”Здравствуй, Мир!” сформируется массив:

З д р а в с т в у й ,   М и р ! \0

Ввод и вывод строк

Для вывода строк можно использовать оператор <<.

При вводе с помощью оператора >> в строку будут включены все символы до первого пробела, поэтому для ввода строк, содержащих любые символы, лучше использовать функцию getline(char s[], int n), которая читает из входного потока не более n – 1 символа. Чтение символов прекращается при поступлении символа новой строки ’\n’ или достижении конца файла. Прочитанный символ новой строки ’\n’ не включается в массив s. При вводе из потока cin вызов функции getline должен иметь вид: cin.getline(s, n).

Средства работы со строками

Существует довольно обширная библиотека функций для работы со строками, заголовочный файле которой string.h. Опишем некоторые из этих функций.

В приводимых описаниях используется обозначение size_t для типа unsigned int. Данное обозначение вводится инструкцией:

typedefunsigned int size_t;

которая имеется в стандартных заголовочных файлах. Оператор typedef вводит новое названия для типа данных, то есть там, где стоит size_t, подразумевается unsigned int. Тип size_t используется для величин, которые не могут быть отрицательными, например, для размеров объектов.

 
  Программа 20. Представления символов - student2.ru

Функция

size_t strlen(const char s[]);

возвращает длину строки s, завершающий символ ’\0’ не учитывается.

Модификатор const запрещает изменение массива s внутри функции.

Пример использования функции strlen:

int n;

n = strlen(”Здравствуй”); // n = 10

Функция

char *strcpy(char dest[], const char src[]);

копирует строку src в строку dest и возвращает указатель на копию dest. О том, что такое указатель будет говориться позже (Глава 10), а пока это понятие не будет использоваться.

Функция

int strcmp(const char s1[], const char s2[]);

посимвольно сравнивает строки s1 и s2, причем сравниваются коды символов. Возвращается значение < 0, если первый несовпадающий символ s1 имеет код меньше, чем код соответствующего символа s2, значение > 0, если первый несовпадающий символ s1 имеет больший код, чем символ s2 и 0 при полном совпадении строк.

Наши рекомендации