
- •Московский государственный социальный университет академия информатики и информационных технологий
- •Введение
- •Часть. Основы программирования на Си
- •1.1. Структура простейшей Си-программы
- •1.2. Данные в Си и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных в Си
- •1.2.3. Правила записи констант в Си
- •1.2.4. Описание переменных и именованных констант в Си.
- •1.2.5. Выражения в Си
- •1.3. Операторы преобразования данных
- •1.3.1. Общие положения
- •1.3.2. Функция форматного выводаprintf()
- •1.3.3. Функция форматного вводаscanf()
- •1.4. Разработка программ на Си
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Си.
- •1. Следование
- •2. Разветвление (развилка)
- •If (условие)
- •If (условие)
- •3. Цикл
- •1.4.4. Примеры разработки программ
- •1.5. Массивы и указатели
- •1.5.1. Понятие массива. Основные правила работы с массивами в Си
- •1.5.2. Примеры программ с массивами.
- •1.5.3. Инициализация массивов
- •1.5.4. Указатели в Си10
- •1.5.5. Связь массивов с указателями в Си
- •Часть. Функции и многофайловые программы в Си
- •2.1. Общие сведения о подпрограммах и функциях
- •2.2. Функции си
- •2.2.1. Описание функции
- •2.2.2. Обращение к функции
- •2.2.3. Место описания функции в программе
- •2.2.4. Примеры программ, использующих функции
- •2.3. Краткие сведения о препроцессоре Си
- •2.3.2.Директива макроопределения #define
- •2.3.3. Директива #include включения файлов
- •2.3.4. Директивы условной компиляции
- •2.415. Многофайловые си-программы
- •2.4.1. Структура программы на Си. Область действия переменных
- •2.4.2. Время жизни и класс памяти переменных
- •Описатели класса памяти
- •2.4.3 Понятие о файле проекта
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации на Си
- •3.1.1. Символьный тип
- •3.1.2. Работа со строками символов в Си. Строковые литералы. .
- •3.1.3. Функции и макросы для работы с символьной информацией
- •3.1.4. Примеры программ
- •3.2. Тип "структура" в Си
- •Структура
- •3.3. Файлы в Си
- •3.3.1. Общие понятия.
- •3.2.Функции Си для работы с файлами
- •3.3.3. Примеры программ, использующих файлы
- •Литература
- •Содержание
Часть. Обработка символьной информации и документов сложной структуры
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.