- •1. Общая характеристика языка Си в сравнении с другими процедурными языками.
- •2. Основные типы данных, переменные и константы. Препроцессор языка Си.
- •3.Операции языка Си. Преобразование типов данных
- •4.Ввод-вывод чисел, символов и строк на консоль. Переключение ввода-вывода, работа с файлами.
- •5.Оператор ветвления, многовариантный выбор.
- •6.Операции отношения, логические операции.
- •7.Циклы и другие управляющие средства.
- •8.Функции: аргументы функции, возвращение значений, локальные переменные, нахождение адресов, указатели.
- •9.Классы памяти и область действия. Автоматические переменные. Внешние переменные. Статические переменные. Внешние статические переменные. Регистровые переменные.
- •10.Массивы и указатели. Динамические объекты. Операции с указателями.
- •11.Строковые константы, массивы символьных строк и их инициализация. Указатели и строки, ввод-вывод и обработка строк.
- •12.Определение структурных переменных. Доступ к компонентам структуры.
- •13.Объединения и перечисления. Указатели и структуры. Массив структур.
- •14. Стандартные библиотечные функции языка Си, функция генерации случайных чисел.
- •15.Динамические структуры данных (стек, список, дерево, граф).
- •16.Графический интерфейс пользователя (gui). Типы данных Win32.
- •17.События и сообщения, оконная процедура, оконный класс, цикл обработки сообщений.
- •18.Создание основного окна приложения, изменение характеристик окна.
- •19.Стандартное окно с сообщением и кнопкой «ок». Функции поддержки окон.
- •20.Обработка сообщений от клавиатуры, часто используемые сообщения.
- •21.Органы управления: кнопки, флажки, переключатели. Групповая рамка. Статический орган управления для вывода текста.
- •22.Однострочное и многострочное поле для ввода текста.
- •23.Список, раскрывающийся список, комбинированный список. Файловые операции.
- •24.Создание процесса, создание потока, рабочие функции потока, обмен сообщениями между процессами и потоками.
- •25. Передача данных с помощью сообщений и через файлы, синхронизация процессов и потоков. Создание многопоточного приложения.
- •26.Синхронные и асинхронные сообщения, посылка сообщения из приложения Windows.
- •27.Графический интерфейс устройства (cdi). Контекст устройства. Регионы и отсечение.
- •28.Файловый ввод-вывод данных средствами Win32api, файловые операции.
- •29.Режимы многозадачности, многопоточная архитектура, преимущества Windows.
- •30.Двусвязный список, операции с двусвязным списком, циклические списки.
- •31.Базовый алгоритм численного интегрирования методом прямоугольников.
- •32.Программная реализация численного интегрирования методом прямоугольников.
11.Строковые константы, массивы символьных строк и их инициализация. Указатели и строки, ввод-вывод и обработка строк.
В языке C, в отличие от языка Pascal, отсутствует специальный строковый тип данных. Строка представляет собой последовательность (одномерный массив) из одного или более символов, последним из которых является нулевой символ таблицы ASCII '\0'. Это единственный вид строки, определенный в C.
Язык C поддерживает строковые константы, называемые строковыми литералами. Строковый литерал – это любая последовательность символов, заключенная в двойные кавычки ("…"). В конце литерала компилятор автоматически добавляет нулевой символ.
Не следует путать понятия строки и символа. Символьная константа заключается в одинарные кавычки, а строковая – в двойные.
Например, 'c' – символьная константа, а "c" – строковая константа.
Литерал можно задать с помощью директивы препроцессора define:
# define STR "…"
Строковая переменная может быть сформирована как одномерный массив типа char либо с помощью указателя на переменную типа char. Количество символов в массиве (объем выделяемой памяти) должно быть не меньше, чем количество символов в строке плюс один символ для хранения символа нуль.
К началу главы
11.1. Представление символьной строки при помощи одномерного массива
Синтаксис объявления имеет вид:
char ID [N];
где ID – идентификатор массива, N – длина массива, при этом в памяти для хранения строки выделяется N байт.
Например, для переменной char ST[10] в памяти выделяется 10 байт, что дает возможность сформировать строку из 9 символов. Для таких строк действуют все правила представления и обработки массивов.
Идентификатор массива – константа типа указатель, значение которой равно адресу первого элемента массива.
Инициализация возможна двумя способами:
· посимвольная инициализация char st[10]={'y','e','s','\0'};
при этом оставшиеся 6 позиций не будут заполнены;
· инициализация на основе строковой константы char st [10]="Yes";
при этом в выделенную для строки память будут помещены 3 символа и добавлен четвертый – символ '\0'.
Инициализация и объявление возможны без указания длины массива char st[]={'y','e','s','\0'};
в этом случае будет создан массив из четырех элементов.
К началу главы
11.2. Указатель на символьную строку
По форме записи данная конструкция ничем не отличается от указателя на символьную переменную: char *S1;
где char – тип указателя на символ, S1 – переменная-указатель.
Для инициализации указателя требуется указать область памяти, где уже находится или будет находиться строка, при этом для строки должен быть выделен необходимый объем памяти.
Существует ряд способов инициализации указателя на строку:
· инициализация строковым литералом char *S1="Yes";
· присваивание значение другого указателя char *S1=S;
где S – идентификатор массива или указатель на другую строку символов.
Указателю можно присваивать значение другого указателя: S1=S;
где S1 – переменная типа указатель; S – строковая константа, идентификатор массива или указатель на другую строку символов.
Например, char *S1, S[10]="Yes"; S1=S;
При этом создаются переменная-указатель S1 и массив символов S, под который выделяется поле длиной 10 символов, 4 из которых будут заполнены. Затем в переменную-указатель записывается адрес символьного массива (рис. 11.1).
Рис. 11.1. Строковая константа и указатель
К началу главы
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 указывает на конец строки, и доступ к этой строке теряется.
