Введение 9
Глава 1. Установка программ под Windows 11
1.1. Создание структуры каталогов 11
1.2. Добавление пути в переменную PATH 12
1.3. Работа с командной строкой 14
1.4. Установка MinGW и MSYS 14
1.5. Установка MinGW-W64 20
1.6. Установка MSYS2 и MinGW-W64 24
1.7. Установка и настройка редактора Eclipse 29
1.8. Создание проектов в редакторе Eclipse 34
Глава 2. Первые шаги 44
2.1. Первая программа 44
2.2. Создание пустого проекта в редакторе Eclipse 47
2.3. Добавление в проект файла с программой 49
2.4. Добавление в проект заголовочного файла 50
2.5. Компиляция и запуск программы в редакторе Eclipse 53
2.6. Структура программы 57
2.7. Комментарии в программе 63
2.8. Вывод данных 65
2.9. Ввод данных 71
2.9.1. Ввод одного символа 71
2.9.2. Функция scanf() 72
2.9.3. Ввод строки 77
2.10. Интерактивный ввод символов 80
2.11. Получение данных из командной строки 82
2.12. Предотвращение закрытия окна консоли 84
2.13. Настройка отображения русских букв в консоли 86
2.14. Преждевременное завершение выполнения программы 89
Глава 3. Переменные и типы данных 91
3.1. Объявление переменной 91
3.2. Именование переменных 92
3.3. Типы данных 93
3.4. Целочисленные типы фиксированного размера 97
3.5. Оператор sizeof и тип size_t 99
3.6. Инициализация переменных 100
3.7. Оператор typedef 100
3.8. Константы 101
3.9. Спецификаторы хранения 104
3.10. Области видимости переменных 105
3.11. Массивы 107
3.12. Строки 110
3.13. Указатели 111
3.14. Динамическое выделение памяти 118
3.14.1. Функции malloc() и free() 118
3.14.2. Функция calloc() 119
3.14.3. Функция realloc() 122
3.15. Структуры 123
3.16. Битовые поля 126
3.17. Объединения 127
3.18. Перечисления 129
3.19. Приведение типов 130
Глава 4. Операторы и циклы 133
4.1. Математические операторы 133
4.2. Побитовые операторы 135
4.3. Операторы присваивания 138
4.4. Оператор запятая 138
4.5. Операторы сравнения 139
4.6. Приоритет выполнения операторов 141
4.7. Оператор ветвления if 142
4.8. Оператор ?: 146
4.9. Оператор выбора switch 147
4.10. Цикл for 149
4.11. Цикл while 152
4.12. Цикл do...while 152
4.13. Оператор continue: переход на следующую итерацию цикла 153
4.14. Оператор break: прерывание цикла 153
4.15. Оператор goto 154
Глава 5. Числа 156
5.1. Математические константы 159
5.2. Основные функции для работы с числами 160
5.3. Округление чисел 164
5.4. Тригонометрические функции 165
5.5. Преобразование строки в число 165
5.6. Преобразование числа в строку 174
5.7. Генерация псевдослучайных чисел 177
5.8. Бесконечность и значение NAN 179
Глава 6. Массивы 181
6.1. Объявление и инициализация массива 181
6.2. Определение количества элементов и размера массива 183
6.3. Получение и изменение значения элемента массива 184
6.4. Перебор элементов массива 185
6.5. Доступ к элементам массива с помощью указателя 186
6.6. Массивы указателей 189
6.7. Динамические массивы 189
6.8. Многомерные массивы 190
6.9. Поиск минимального и максимального значений 193
6.10. Сортировка массива 195
6.11. Проверка наличия значения в массиве 198
6.12. Копирование элементов из одного массива в другой 201
6.13. Сравнение массивов 203
6.14. Переворачивание массива 204
Глава 7. Символы и C-строки 206
7.1. Объявление и инициализация отдельного символа 206
7.2. Настройка локали 212
7.3. Изменение регистра символов 216
7.4. Проверка типа содержимого символа 218
7.5. Объявление и инициализация C-строки 222
7.6. Доступ к символам внутри C-строки 224
7.7. Определение длины строки 225
7.8. Перебор символов C-строки 226
7.9. Основные функции для работы с C-строками 227
7.10. Поиск и замена в C-строке 232
7.11. Сравнение С-строк 237
7.12. Форматирование С-строк 242
Глава 8. Широкие символы и L-строки 244
8.1. Объявление и инициализация широкого символа 245
8.2. Вывод и ввод широких символов 247
8.3. Изменение регистра символов 249
8.4. Проверка типа содержимого широкого символа 251
8.5. Преобразование широких символов в обычные и наоборот 255
8.6. Объявление и инициализация L-строки 256
8.7. Доступ к символам внутри L-строки 257
8.8. Определение длины L-строки 258
8.9. Перебор символов L-строки 259
8.10. Вывод и ввод L-строк 260
8.11. Преобразование C-строки в L-строку и наоборот 263
8.12. Преобразование кодировок 265
8.13. Основные функции для работы с L-строками 271
8.14. Поиск и замена в L-строке 277
8.15. Сравнение L-строк 282
8.16. Преобразование L-строки в число 286
8.17. Преобразование числа в L-строку 294
8.18. Типы char16_t и char32_t 297
Глава 9. Работа с датой и временем 300
9.1. Получение текущей даты и времени 301
9.2. Форматирование даты и времени 305
9.3. «Засыпание» программы 309
9.4. Измерение времени выполнения фрагментов кода 311
Глава 10. Пользовательские функции 312
10.1. Создание функции и ее вызов 312
10.2. Расположение объявлений и определений функций 315
10.3. Способы передачи параметров в функцию 318
10.4. Передача массивов и строк в функцию 320
10.5. Переменное количество параметров 324
10.6. Константные параметры 325
10.7. Статические переменные и функции 326
10.8. Способы возврата значения из функции 328
10.9. Указатели на функции 330
10.10. Передача в функцию и возврат данных произвольного типа 331
10.11. Рекурсия 332
10.12. Встраиваемые функции 333
Глава 11. Обработка ошибок 336
11.1. Типы ошибок 336
11.2. Предупреждающие сообщения при компиляции 337
11.3. Переменная errno и вывод сообщения об ошибке 338
11.4. Способы поиска ошибок в программе 341
11.5. Отладка программы в редакторе Eclipse 345
Глава 12. Чтение и запись файлов 351
12.1. Открытие и закрытие файла 351
12.2. Указание пути к файлу 354
12.3. Режимы открытия файла 356
12.4. Запись в файл 358
12.5. Чтение из файла 360
12.6. Чтение и запись двоичных файлов 363
12.7. Файлы произвольного доступа 365
12.8. Создание временных файлов 367
12.9. Перенаправление ввода/вывода 369
12.10. Работа с буфером ввода и вывода 372
Глава 13. Низкоуровневые потоки ввода и вывода 374
13.1. Открытие и закрытие файла 374
13.2. Чтение из файла и запись в файл 377
13.3. Файлы произвольного доступа 380
13.4. Создание временных файлов 381
13.5. Дескрипторы потоков ввода/вывода 382
13.6. Преобразование низкоуровневого потока в обычный 383
13.7. Создание копии потока 384
13.8. Перенаправление потоков 384
Глава 14. Работа с файловой системой 386
14.1. Преобразование пути к файлу или каталогу 386
14.2. Переименование, перемещение и удаление файла 390
14.3. Проверка прав доступа к файлу и каталогу 391
14.4. Изменение прав доступа к файлу 393
14.5. Делаем файл скрытым 394
14.6. Получение информации о файле 395
14.7. Функции для работы с дисками 399
14.8. Функции для работы с каталогами 401
14.9. Перебор объектов, расположенных в каталоге 403
Глава 15. Потоки и процессы 407
15.1. Потоки в WinAPI 407
15.1.1. Создание и завершение потока 407
15.1.2. Синхронизация потоков 412
15.2. Функции для работы с потоками, объявленные в файле process.h 417
15.3. Потоки POSIX 420
15.3.1. Создание и завершение потока 420
15.3.2. Синхронизация потоков 423
15.4. Запуск процессов 426
15.5. Получение идентификатора процесса 429
Глава 16. Создание библиотек 430
16.1. Статические библиотеки 430
16.1.1. Создание статической библиотеки из командной строки 430
16.1.2. Создание статической библиотеки в редакторе Eclipse 434
16.2. Динамические библиотеки 438
16.2.1. Создание динамической библиотеки из командной строки 438
16.2.2. Создание динамической библиотеки в редакторе Eclipse 440
16.2.3. Загрузка динамической библиотеки во время выполнения программы 443
16.2.4. Экспортируемые и внутренние функции 446
16.2.5. Функция DllMain() 446
Глава 17. Прочее 448
17.1. Регистрация функции, выполняемой при завершении программы 448
17.2. Выполнение системных команд 449
17.3. Получение и изменение значений системных переменных 451
17.4. Директивы препроцессора 454
17.5. Создание значка приложения 455

Заключение 459
Приложение. Описание электронного архива 461
Предметный указатель 463