Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Глава 9 Символьная информация и строки






 

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

Символьные константы используются для изображения отдельных знаков, имеющих индивидуальные внутренние коды. Каждая символьная константа – это лексема (элемент языка СИ), которая состоит из изображения символа и ограничивающих апострофов: ‘A’, ‘a’, ’B’, ’8’, ’+’, ’; ’.

Внутри апострофов можно записать любой символ, изображаемый на экране или принтере в текстовом режиме а также управляющие символы.

Для символьных данных (переменных) введен базовый тип char. Описание символьных переменных имеет вид:

char список_имен_переменных;

Пример:

char a, z;

 

9.1 Ввод - вывод символьных данных

 

 

Для ввода и вывода символьных значений в форматных строках библиотечных функций printf() и scanf() используется спецификация преобразования % c.

Пример:

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

 

/* удаление повторяющихся пробелов */

#include< stdio.h>

void main()

{

char z, s; /*z–текущий вводимый символ*/

/*s–предыдущий введенный символ*/

printf(“\nНапишите предложение с точкой в конце: \n”);

for (z=s=’ ’; z! =’.’; s=z) {

scanf(“%c”, & z); // z=getch();

if (z! =’ ‘ || s! =’ ‘)

printf(“%c”, z); } /*конец цикла обработки*/

} /*конец программы*/

 

В программе две символьные переменные: z – для чтения очередного символа и s – для хранения предыдущего. В заголовке цикла переменные s и z получают значение “пробел”. Очередной символ вводится как значение переменной z, и пара z, s анализируется. Если хотя бы один из символов значений пары отличен от пробела, то значение z печатается. В заголовке цикла z сравнивается с символом “точка” и при несовпадении запоминается как значение s. Далее цикл повторяется до появления на входе точки, причем появление двух пробелов (z и s)приводит к пропуску оператора печати.


 

9.2 Внутренние коды и упорядоченность символов

 

ВАЖНО! В языке принято соглашение, что везде, где синтаксис позволяет использовать целые числа, можно использовать и символы, т.е. данные типа char, которые при этом представляются числовыми значениями своих внутренних кодов. Такое соглашение позволяет сравнительно просто упорядочивать символы, обращаясь с ними как с целочисленными величинами.

Например, внутренние коды десятичных цифр в таблицах кодов ASCII упорядочены по числовым значениям, поэтому несложно перебирать символы десятичных цифр в нужном порядке.

Пример:

Следующая программа печатает цифры от 0 до 9 и шестнадцатеричные представления их внутренних кодов.

/*печать десятичных цифр*/

#include< stdio.h>

void main()

{ char z;

for (z=’0’, z< =’9’, z++) {

if (z= =’0’ | |z= =’5’) printf(“\n”);

printf(“%c – %x”, z, z);

}

} /*конец программы*/

 

Результат выполнения программы:

0–30 1–31 2–32 3–33 4–34

5–35 6–36 7–37 8–38 9–39

 

Обратите внимание на то, что символьная переменная z является операндом арифметической операции ‘ ++ ’, выполняемой над числовым представлением ее внутреннего кода. Для изображения значения символов в форматной строке функции printf() используется спецификация . шестнадцатеричные коды выводятся с помощью спецификации .

Пример:

Воспользовавшись упорядоченностью внутренних кодов букв латинского алфавита, очень просто его напечатать.

/*печать латинского алфавита*/

#include< stdio.h>

void main() {

char z;

for (z=’A’, z< =’Z’, z++)

printf(“%c”, z);

} /*конец программы*/

 

Результат выполнения программы:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

9.3 Строки или строковые константы

 

В программе строки, или строковые константы, представляются последовательностью изображений символов, заключенной в кавычки (не в апострофы), например “любые символы”. Среди символов строки могут быть эскейп-последовательности, соответствующие кодам не изображаемых (специальных) символьных констант.

Примеры:

“1234567890”

“\t состав президиума”

“начало строки \t и конец строки”.

В качестве терминирующего символа выбран символ с кодом 0 (не путайте его с символом '0'). Таким образом, определение

char HelloStr [] = " Hello, world";

фактически интерпретируется как

char HelloStr [] = {'H', 'e', 'l', 'l', 'o', ' ', ', ', 'w', 'o', 'r', 'l', 'd', '\0'};

Это происходит при инициализации массива строкой. Во всех остальных случаях встретившаяся строка интерпретируется как еще не созданный безымянный массив соответствующей длины. То есть выражение

printf (" Hello, world\n");

на самом деле интерпретируется как

char str1 [ ] = " Hello, world\n";

printf (str1);

При размещении строки в памяти транслятор автоматически добавляет в ее конец символ ‘\0’, т.е. нулевой байт.

Количество элементов в таком массиве на 1 больше, чем в изображении соответствующей строковой константы, т.к. в конец строки добавили нулевой байт ‘\0’.

У строк есть еще особенность: транслятор отводит каждой строке отдельное место в памяти ЭВМ даже в тех случаях, когда несколько строк полностью совпадают (стандарт языка СИ предполагает, что в конкретных реализациях это правило может не выполняться).

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

Пример:

/*печать символьной строки*/

#include< stdio.h>

void main()

{ char B[]=”Cезам, откройся! ”;

printf(“%s”, B); } /*конец программы*/

 

Результат выполнения программы: Сезам, откройся!

 

В программе длина массива В – 17 элементов, т.е. длина строки, помещаемой в массив (16 символов), плюс нулевой байт окончания строки. Именно 17 байтов выделяется при инициализации массива в приведенном примере. Инициализация массива символов с помощью строковой константы представляет собой сокращенный вариант инициализации массива и введена в язык для упрощения. Можно воспользоваться обычной инициализацией, поместив начальные значения элементов массива в фигурные скобки и не забыв при этом поместить в конце списка начальных значений специальный символ окончания строки ‘\0’. Таким образом, в программе была допустима такая инициализация массива В:

char B[ ] = {‘C’, ’е’, ’з’, ’а’, ’м’, ’, ’, ’ ’, ’о’, ’т’, ’к’, ’р’, ’о’, ’й’, ’с’, ’я’, ’! ’, ’\0’};


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал