- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
11.3. Ввод/вывод символьных строк
Ввод символьных строк с клавиатуры в языке C осуществляется с помощью функций scanf() и gets(), объявленных в заголовочном файле stdio.h. При работе с этими функциями следует помнить, что для строк предварительно должна быть выделена память. Конечный нуль добавляется после завершения ввода строки автоматически.
Существует несколько способов ввода строк:
scanf ("%s",S1); где S1 – указатель типа char* на предварительно выделенную область. При использовании формата %s аргумент рассматривается как строка. Ввод строки реализуется до пробела или нажатия [Enter]. Несколько слов вводить в одну переменную с помощью scanf нельзя;
scanf ("%Ns",S1); где N – максимальное число символов, записываемых в строку S1. Заполнение строки заканчивается при вводе N непробельных символов или выполняется до первого пробельного символа.
gets (S1); при помощи этой функции можно вводить строку, содержащую пробелы. Ввод прекращается при нажатии [Enter] или при заполнении буфера клавиатуры.
Вывод символьных строк на экран в C осуществляется с помощью функций printf() и puts():
printf("%s",S1); где S1 – указатель типа char*
puts (S1);
Вывод строки продолжается до символа '/0'.
Пример 1. Что напечатает ЭВМ?
#include <stdio.h>
#define STR "What is your name?"
int main()
{
char *ch;
static char ch1[]="My name is George\n";
ch=STR;
printf("\n%s \t %s",ch,ch1);
/*\t – табуляция – сдвиг на заданное количество позиций*/
for (int i=0;i<6;i++)
{
printf("\n %c", *(ch+i));
printf(" %c", *(ch1+i));
}
return 0;
}
На экране будут выведены строки:
What is your name? My name is George
-
W
M
h
y
a
t
n
a
i
m
Пример 2. Задан указатель на символьную строку. Подсчитать, сколько раз в строке встретится буква 'а':
# include <stdio.h>
int main()
{
int k;
char *S2="Ivanov is an engineer";
for (k=0; (*S2)!= '\0'; S2++)
if ((*S2)=='a'||(*S2)=='A') k++;
printf("\n number of \'a\' is %d",k);
return 0;
}
После завершения работы цикла указатель S2 указывает на конец строки, и доступ к этой строке теряется.
11.4. Массивы символьных строк
Массив строк есть не что иное, как массив данных определенного типа. Строка сама уже является массивом символов, поэтому массив символьных строк является двумерным.
При определении массива строк используются два индекса:
первый индекс определяет максимальное количество строк в массиве;
второй – максимальную длину каждой строки.
Например,
static char massiv[3][8]= |
{"Ivanov", |
|
"Petrov", |
|
"Sidorov"}; |
Под переменную massiv выделяется область размером 3×8 байт памяти, по 8 байт для каждой строки. Таким образом, указатель на начало массива massiv и указатели на начало строк massiv[i] представляют собой указатели-константы.
Можно объявить массив символьных строк с помощью указателей:
char *list[N]; где N – количество строк в массиве.
Переменная list представляет собой массив из N указателей, память при этом выделяется для хранения N значений указателей. Таким образом, имя массива list является константой-указателем. Элементы массива list[i] используются для хранения адресов строк и являются переменными величинами.
Инициализация символьных строк с помощью указателей:
char *list[3]={"Ivanov","Petrov","Sidorov"};
Доступ к строке:
list [0] – ссылка на "Ivanov";
Доступ к символу указанной строки:
*list[0] – определяет символ "I" в строке "Ivanov";
*(list[1]+2) – символ 't' в строке "Petrov".
Пример 3. Вывести на экран содержимое массивов строк massiv и list:
#include <stdio.h>
int main()
{
static char massiv[3][8]={"Ivanov","Petrov", "Sidorov"};
char* list[3]={"Ivanov","Petrov","Sidorov"};
printf("\n==================\n");
for(int i=0;i<3;i++)
printf("%s %s\n",massiv[i],list[i]);
list[0]=massiv[1];
list[1]="Rogov";
printf("\n==================\n");
for(i=0;i<3;i++)
printf("%s %s\n",massiv[i],list[i]);
return 0;
}
Результат работы программы:
==================
Ivanov |
Ivanov |
Petrov |
Petrov |
Sidorov |
Sidorov |
==================
Ivanov |
Petrov |
Petrov |
Rogov |
Sidorov |
Sidorov |
