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

Часть. Обработка символьной информации и документов сложной структуры

3.1. Обработка символьной информации на Си

3.1.1. Символьный тип

Здесь мы углубим знания, полученные в части I пособия. Описание символьной переменной а:char а; данные типаcharзанимают в памяти один байт и принимают значения на множестве символов, допутимых для данного компьютера. Внутренний код байта определяется по кодовой таблице (ASCII - см., например,[2]).

Тип сhar рассматривается в Си как тип целое (со знаком - signed charили простоchar); при желании над переменными типа char можно выполнять арифметические операции.

Cимвольная константа записывается как соответствующий символ, заключенный в апострофы. Оператор а='а' означает, что символьной переменной с именем а присваивается значение символа а.

Для использования управляющих символов (коды 0 - 31 ASCII) в Си имеются управляющие константы, запись которых в апострофах начинается с наклонной черты (\), например:

\n - перевод строки,

\f - перевод страницы,

\a - звонок,

\0 - нулевой байт (используется для обозначения конца строки).

Если в апострофах после косой черты стоит восьмеричная (начинается с 0 и содержит цифры от 0 до 7) или шестнадцатеричная (начинается с х или Х) константа, то она рассматривается как символ с соответствующим кодом; например, '\0100'-прописная латинская Р.

3.1.2. Работа со строками символов в Си. Строковые литералы. .

В Си отсутствует специальный строковый тип. Вместо такого типа используется понятие стрoкового литерала(ASCIIZ-cтроки).

Строковый литерал- последовательность символов, заключенная в двойные кавычки, например, " text". В памяти ЭВМ строковый литерал представляется как массив элементов типа char, в конце которого помещен символ '\0' (нуль-терминатор).

Адрес строкового литерала и интерпретация его как элемента языка зависит от приема его использования.

Строковый литерал может использоваться в Си-программах следующим образом:

1. Для инициализации массивов типа char.

Следующие описания являются идентичными:

сhar str[6]="слово"; /*6-й символ - нуль-терминатор*/

char str[]="слово";

char str[6]={'с','л','о','в','о', '\0'};

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

Пример.

void main()

{char a[10]="слово"/*последние 4 символа имеют неопредел.знач.*/...

В этом случае адрес первого символа литерала есть значение имени массива (адрес первого элемента массива). Массив располагается в стеке функции.

2. Для инициализации или присваивания значения переменной типа char *. Например:

char *str1,*str2="text2";...

str1="text1";

Литералы "text1" и "text2" располагаются в сегменте данных программы, значения адресов их первых элементов присваиваются переменным-указателям str1 и str2. Литералы в данном случае рассматриваются как указатели-константы.

Замечание. Недопустимо присваивать значения, в том числе и значения литералов, именам массивов, так как имя массива - это указатель-константа. Например, следующий фрагмент программыневерен:

char str[6];

str="слово";...

3. Для записи выводимого текста в функциях вывода (printf, puts,и т.д.). Литералы, используемые в этих операторах, хранятся в сегменте данных.

4. Последовательности символов, вводимые с помощью функции scanf по формату s,с помощью функции gets и аналогичных функций, записываются в память как литералы (символ \n не заносится в память, вместо него записывается \0). Адресом литерала становится адрес переменной-указателя или имя символьного массива, в который вводится литерал.

Замечание об опции Main Menu-Options-Code Generation-Merge Duplicated Strings. Если она включена, то компилятор блокирует появление одинаковых литералов в сегменте данных программы.

Для ввода и вывода строк в Си можно применять функции scanfиprintfс использованием формата s. Существуют также специальные функции ввода-вывода строк символовputsиgets. Они действуют также, какscanf("%s",string)иprintf("%s\n",string),за одним исключением:scanfпринимает символы, пока не встретится \n, а передает в память символы до \n или пробела (символы от первого пробела до \n остаются в буфере);getsпередает в память все символы до \n.