Текст в переменной
До сих пор ваши переменные хранили числа и отдельные символы. Но программы постоянно работают с текстом: именами, сообщениями, паролями. В программировании фрагмент текста называют строкой, потому что это строка из символов, идущих один за другим, как бусины на нитке.
В C нет особого типа данных для текста. Строка — это просто массив символов, массив типа char. Создаётся он так:
char name[] = "Anna";Текст пишется в двойных кавычках. Квадратные скобки остаются пустыми, поэтому компилятор сам подсчитывает размер массива, как и для массива чисел. Сколько в массиве элементов? В тексте 4 буквы, а в массиве 5 элементов:
индекс: 0 1 2 3 4
символ: 'A' 'n' 'n' 'a' '\0'Последний элемент, '\0', — это нулевой символ-терминатор: обратная косая черта и нуль в одинарных кавычках, потому что это один символ. В выводе его не видно; его значение — число 0. Он отмечает место, где текст заканчивается, и компилятор сам добавляет его в конец любого текста в двойных кавычках. Зачем он нужен? Больше ничто не сообщает printf и другим функциям, где текст заканчивается (а позже в этом уроке вы увидите тексты, которые короче своего массива). Поэтому они идут по строке символ за символом, пока не дойдут до '\0'.
Чтобы вывести строку, используйте спецификатор формата %s (s от string — «строка»). После форматной строки напишите имя массива без квадратных скобок:
char name[] = "Anna";
printf("Привет, %s!\n", name);Это выведет:
Привет, Anna!printf выводит символы name по одному и останавливается на '\0'. Благодаря этому признаку конца строку можно вывести целиком, а массив чисел — нельзя.
Следите за кавычками. В одинарных кавычках — один символ типа char: 'A'. В двойных — строка: "A" — это массив из двух символов, 'A' и '\0'. Если их перепутать, программа не скомпилируется:
char letter = "A";main.c:4:10: error: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char[2]' [-Wint-conversion]Сообщение говорит об указателях, с которыми вы познакомитесь позже в курсе. Важная часть — char[2]: там, где должен быть один char, вы дали массив из двух символов. Увидев такое сообщение, проверьте кавычки.
Ещё одна частая ошибка — printf(name);. Так выглядит проще, но программа не скомпилируется:
char name[] = "Anna";
printf(name);main.c:5:12: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security]printf всегда считает первым в скобках форматную строку — инструкцию, что и как выводить. Если бы в имени был символ %, printf принял бы его за спецификатор формата. Поэтому строку всегда выводите через %s: printf("%s\n", name);.
Задание
- 1
Под строкой приветствия создайте строку
playerс текстом"Luke"и выведите её через%s, чтобы в выводе была строкаИгрок: Luke. - 2
Сколько элементов в массиве
player? Ниже сохранитеsizeof(player)в переменнуюsizeтипаintи выведите её:Размер: 5.sizeofдаёт размер в байтах, а одинcharзанимает ровно один байт, поэтому для массива символов это число элементов. Почему 5, если в имени всего 4 буквы?