Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_08.doc
Скачиваний:
9
Добавлен:
23.09.2019
Размер:
334.85 Кб
Скачать

1.4. Вывод текстовых данных

При выводе текстовых данных особые проблемы возникают только в том случае, когда сообщения, содержащие русские буквы, готовятся в среде Windows (кодовая страница 1251), а выводятся консольным приложением в 866-й кодовой странице. В этом случае можно написать сравнительно несложную функцию конвертирования текстов из одной кодировки в другую. В кодовой странице 1251 буквы русского алфавита кодируются подряд, начиная с кода 192 (большая буква 'А') до кода 255 (малая буква 'я'). Буквы 'Ё' и 'ё' имеют коды 164 и 184 соответственно. Поэтому при перекодировке необходимо:

  • коды букв, принадлежащие интервалу [192, 239] уменьшить на 64, чтобы вогнать их в интервал [128, 174];

  • коды букв, принадлежащие интервалу [240, 255] уменьшить на 16, чтобы вогнать их в интервал [224, 239];

  • коды букв Ё и ё заменить на 240 и 241 соответственно.

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <string.h>

char *to_866(unsigned char *s)

{ static unsigned char str[80];

int j=0;

while (s[j]!='\0')

{ str[j]=s[j];

if(s[j]>=192 && s[j]<=239) str[j]-=64;

if(s[j]>=240 && s[j]<=255) str[j]-=16;

if(s[j]==164) str[j]=240;

if(s[j]==184) str[j]=241;

j++;

}

str[j]='\0';

return str;

}

void main()

{ char s[]="Привет";

cout << s << endl;

cout <<to_866(s) << endl;

getch();

}

//=== Результат работы ===

В первой строке вывод реализован без перекодировки, а во второй – с перекодировкой.

1.4.1. Форматный вывод

Для форматного вывода символьных значений в функции printf используется форматный указатель %c, а для вывода строк – форматный указатель %s. При создании консольных приложений Windows можно воспользоваться программой перекодировки, аналогичной функции to_866.

#include <stdio.h>

#include <conio.h>

void main()

{

char ch1='F';

unsigned char ch2='5';

char ch3[]="ABCD";

printf("%c %c %s",ch1,ch2,ch3);

getch();

}

//=== Результат работы ===

F 5 ABCD

1.4.2. Потоковый вывод

В потоковом выводе единственная проблема может возникнуть в связи с перекодировкой русских сообщений в консольном приложении Windows.

#include <iostream.h>

#include <conio.h>

void main()

{

char ch1='F';

unsigned char ch2='5';

char ch3[]="ABCD";

cout<<ch1<<' '<<ch2<<' '<<ch3;

getch();

}

//=== Результат работы ===

F 5 ABCD

1.4.3. Специальные функции вывода текстовой информации

К дополнительным средствам вывода следует отнести функцию puts(str), передающую строку str на стандартное устройство stdout, и вывод на дисплей с помощью функции cprintf. Обращение к последней не отличается от обращения к функции printf, но дисплей не допускает переназначения потока вывода. Кроме того, при выводе на дисплей имеется возможность окрасить текст в тот или иной цвет.

1.5. Операции над текстовыми данными

1.5.1. Операции над символьными данными

Значения символьных данных эквивалентны однобайтовым целым числам. Поэтому им можно присваивать целочисленные значения, равные соответствующим кодам таблицы ASCII, сравнивать на принадлежность тем или иным интервалам. Подобного рода операции упрощаются, если прибегнуть к группе специальных функций, прототипы которых сосредоточены в файле ctype.h. Все эти функции организованы по единому шаблону – их единственным аргументом является числовой код анализируемого символа. Возвращаемое каждой функцией значение либо равно 0, если соответствующая проверка дала отрицательный результат, либо отлично от нуля в случае истинности проверяемого условия. Перечень этих функций приведен в табл.1.

Таблица 1

Функция

Проверяемое условие

isalnum(ch)

Является ли ch цифрой или буквой латинского алфавита

isalpha(ch)

Является ли ch буквой латинского алфавита

isascii(ch)

Принадлежит ли ch первой половине таблицы ASCII

iscntrl(ch)

Принадлежит ли ch группе управляющих символов (ch<0x20)

isdigit(ch)

Является ли ch цифрой

isgraph(ch)

Является ли ch отображаемым символом (0x21 ch 0x7E)

islower(ch)

Является ли ch малой буквой латинского алфавита

isprint(ch)

Является ли ch отображаемым символом (0x20 ch 0x7E)

ispunct(ch)

Является ли ch символом-разделителем (iscntrl || isspace)

isspace(ch)

Является ли ch обобщенным пробелом (0x20, 0x09,0x0A,0x0D)

isupper(ch)

Является ли ch большой буквой латинского алфавита

isxdigit(ch)

Является ли ch шестнадцатеричной цифрой

В раздел type.h включены еще три функции преобразования аргумента ch. Результатом преобразования является возвращаемое значение функции:

  • toascii(ch) – возвращает код, образованный 7 младшими битами ch;

  • tolower(ch) – возвращает код строчной буквы, если ch является кодом заглавной буквы;

  • toupper(ch) – возвращает код заглавной буквы, если ch является кодом строчной буквы.