Нуль-терминатор
Часть раздела Logic & Flow путешествия по C на Coddy — урок 13 из 63.
Вы узнали, что строки в C — это массивы символов, но есть важная деталь, благодаря которой они работают правильно: каждая строка в C должна заканчиваться специальным символом, называемым нулевым терминатором, записываемым как \0.
Нуль-терминатор — это символ с ASCII-значением ноль, который отмечает конец строки. Без него такие функции, как printf, не знали бы, где заканчивается ваша строка, и продолжали бы считывать память, пока случайно не встретили бы нулевой байт, что часто приводит к выводу «мусора».
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// \0 говорит C: "строка заканчивается здесь"Когда вы инициализируете строку литералом, таким как "Hello", C автоматически добавляет нулевой символ за вас. Но когда вы создаете строку вручную посимвольно, вы должны не забыть добавить \0 в конце.
Этот нулевой символ — вот почему слово из 5 символов, такое как "Hello", требует массив символов из 6 элементов: одно дополнительное место для \0. Понимание этой концепции крайне важно, поскольку она является основой того, как все строковые функции C определяют, где начинаются и заканчиваются строки.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует создание и работу со строками с использованием ручной посимвольной инициализации с правильным завершающим нулем. Ваша программа должна:
- Объявить символьный массив с именем
nameровно из 5 элементов - Вручную инициализировать массив
nameпосимвольно, чтобы получилось слово "John" с правильным завершающим нулем:- Первый элемент: 'J'
- Второй элемент: 'o'
- Третий элемент: 'h'
- Четвертый элемент: 'n'
- Пятый элемент:
'\0'(нуль-терминатор)
- Объявить второй символьный массив с именем
cityровно из 7 элементов - Вручную инициализировать массив
cityпосимвольно, чтобы получилось слово "Boston" с правильным завершающим нулем:- Использовать отдельные присваивания символов для 'B', 'o', 's', 't', 'o', 'n' и
'\0'
- Использовать отдельные присваивания символов для 'B', 'o', 's', 't', 'o', 'n' и
- Вывести обе строки с помощью
printf, используя спецификатор формата%s - Продемонстрировать, что происходит без завершающего нуля, создав третий символьный массив с именем
testиз 4 элементов - Инициализировать
testтолько символами 'A', 'B', 'C', 'D' (без нуль-терминатора) - Вывести массив
testс помощью%s, чтобы показать непредсказуемый результат
Ваш вывод должен отображать результаты в следующем формате:
Name: John
City: Boston
Test without null terminator: ABCD[unpredictable characters]Эта задача проверяет ваше понимание ручного создания строк, критической важности нуль-терминатора '\0' в строках C и того, как printf с %s полагается на поиск нуль-терминатора, чтобы определить, где заканчивается строка.
Шпаргалка
Строки в языке C — это массивы символов, которые должны заканчиваться нуль-терминатором \0, чтобы обозначить конец строки.
Нуль-терминатор имеет значение ASCII, равное нулю, и сообщает таким функциям, как printf, где заканчивается строка:
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// \0 сообщает C: "Строка заканчивается здесь"При использовании строковых литералов, таких как "Hello", C автоматически добавляет нуль-терминатор. При создании строк посимвольно вы должны добавлять \0 вручную.
Строке требуется один дополнительный элемент массива для нуль-терминатора — для "Hello" (5 символов) требуется массив из 6 элементов.
Попробуйте сами
#include <stdio.h>
int main() {
// TODO: Напишите свой код здесь
// Объявите и инициализируйте массивы символов, как указано
// Выведите результаты
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции