- •Зачем нужны кодировки символов?
- •Си. Представление символов
- •Задания
- •Кроме латиницы Функция setlocale
- •Задания
- •Приложение 1. Управляющие символы
- •Управляющие коды в Си (эскейп-последовательности)
- •Приложение 2. Расширенная ascii таблица
- •Кодовая страница
- •Альтернативная кодировка
- •Windows кодировка
- •Приложение 3. Спецификаторы строки формата
Си. Представление символов
Символьная константа в Си есть целое, записанное в виде символа, обрамленного одиночными кавычками. Например, символу 'A' соответствует десятичное число 65 (шестнадцатеричное 0x41). Символьные константы считаются данными типа int. Символами можно оперировать, как числами. Например, переменные и константы символьного типа можно использовать в арифметических выражениях.
В языке программирования Си тип данных char – это обычный числовой тип. Объект типа char имеет внутреннее представление как объект целого типа в диапазоне от 0 до 255. Однако в операциях ввода-вывода объекты целого типа могут быть представлены символами кодировочной таблицы.
Пример ввода (чтения) символа и его вывода разными способами:
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h>
int main(void) { unsigned char c; c = getchar(); putchar(c); printf("\n%c %d\n", c, c); getchar(); return 0; } |
Строка 1 — #include <stdio.h> — означает «включи заголовок stdio.h». В файле с заголовком stdio.h объявляются функции, связанные с вводом и выводом данных. Аббревиатуру stdio можно перевести как стандартный ввод-вывод (англ. standard input/output). Буква «h» после точки означает заголовок (англ. header). В заголовках, которые, как правило, представлены отдельными заголовочными файлами, обычно объявляются предоставляемые соответствующими им библиотеками функции, типы данных, константы и определения препроцессора.
Строка 3 — определение функции main. Оно начинается с объявления:
int main (void)1
что значит: «функция с именем main, которая не имеет аргументов (void) и возвращает целое число (число типа int от англ. integer)»
Английское слово void можно перевести как «пустота». Далее открывается фигурная скобка и идёт тело функции, в конце фигурная скобка закрывается. Тело функции определяет последовательность действий, выполняемых данной. В данном примере тело функции состоит из операторов в строках с 5-й по 10-ю.
Функция main() — главная функция программы, именно с нее начинается выполнение программы.
Строка 5 — объявление переменной c как без знаковой переменной целого типа char:
char c;
Переменная типа char имеет своим значением целое число unsigned char в диапазоне от 0 до 255. Но в операциях ввода-вывода переменные типа char могут быть представлены символами кодировочной таблицы ASCII. Поэтому, хотя для чтения значений переменных обычно используется функция scanf(), для чтения значений переменных типа char уместно использовать функцию getchar() (строка 6). Парная ей функция putchar()(строка 7) используется для вывода значения переменной типа char именно в виде символа кодировочной таблицы.
Строка 8 — стандартная функция форматированного вывода printf():
printf("\n%c %d\n", c, c);
Строка в кавычках (строковая константа) задает формат вывода. Обратите внимание на комбинацию \n — она включает в выводимую строку управляющий код (или управляющий символ) перевода (также разрыва или завершения) строки. Комбинация, начинающаяся с символа %, определяет формат вывода значений переменных из списка, следующего после строки формата. Здесь список вывода состоит из двукратного повторения переменной c. В первый раз она выводится как символ, второй раз – как десятичное целое число – код символа. На скриншоте ниже в первой строке латинская буква A отобразилась как результат ввода с клавиатуры (действие в строке 6). Заметьте, что ввод символа A был завершен нажатием клавиши Enter, то есть вводом управляющего кода перевода строки. Во второй строке та же буква A появилась в результате действия putchar(c) в 7-й строке. Третья строка – результат действия printf("\n%c %d\n", c, c) ‑ сначала выводится символ, потом его код.
Но в 9-й строке повторно указана инструкция getchar(). Она потребовалась для того, чтобы прочитать управляющий код перевода строки, которым был завершен ввод символа. Обычно такая инструкция используется для задержки окна работы программы.
При запуске программы непосредственно из графического окружения (в данном случае это среда Dev-Cpp), отведенное программе окно обычно закрывается сразу же после завершения программы. Функция getchar() ожидает ввод пользователя, тем самым «откладывая» завершение программы. Какие именно действия могут прервать это ожидание — зависит от системы, однако можно надеяться, что нажатие клавиши ⏎ Enter завершит эту функцию в любой системе.
В среде Dev-Cpp для задержки окна программы можно использовать функцию system("PAUSE"). Именно она здесь используется и сообщение «Для продолжения нажмите любую клавишу…» ‑ это приглашение пользователю от функции system()завершить работу программы. Однако, если бы предыдущий getchar()не прочитал управляющий код, он был бы обработан системной функцией и завершил выполнение программы (инструкция return в 10-й строке).
