10.22 Строки
TODO Не дошли до malloc(), требуется пересмотр объёма + inplace документация
Что мы знаем про строки из лекций?
Где хранится длина строки?
Чем это опасно?
Ввод и вывод строк
Ввод с помощью scanf() и fgets; вывод с помощью printf() и puts() scanf() вводит слово, ине вводит пробел, перевод строки т. п. — они остаются в буфере ввода;
→ надо явно писать scanf("%19s\n", s) для буфера из 20 байтов
fgets() вводит одну строку, включая перевод строки, для буфера из 20 байтов надо писать fgets(s, 20, stdin)
Курьёз: был ещё gets, но нет)
Написать программу которая вводит строку из 12 символов, переставляет в обратном порядке прямо внутри строки, и выводит её. На вход подавать строго больше, чем 12 символов
- Обратить внимание на то, как используются числа 11, 12 и 13
Строковые функции
Были на лекциях типы size_t и ssize_t? Если нет: size_t используется для размеров (например, длина буфера). Обычно это unsigned long int
ssize_t (aka «signed size_t») используется для отчёта о количестве введённых байтов, может быть нулевым и отрицательным
Функция (s) ищет 0 в массиве s; индекс этого нуля — это «длина строки»
В предыдущем задании считать, что размер строки не превосходит 100; вводить можно любое количество символов
Во всех строковых функциях Си нужно всегда следить:
- Чтобы в конце строки был нулевой байт
- Чтобы строка при копировании помещалась в отведённый ей массив
strlcpy(приёмник, источник, размер) / strlcat(приёмник, источник, размер)
не использовать: strcpy, strcat, strncpy, strncat (две последние не ставят '\0' в конец строки, если она не влезла!) (string_copying);
Ввести n и строку, после чего сформировать новую строку из n копий введённой строки, вывести эту новую строку Варианты на выбор: strlcpy() + strlcat(); или проинициализировать dst пустой строкой + strlcat()
Ввести две строки, сравнить их с помощью strcmp(строка, строка) (есть ещё strncmp)
Ввести две строки, проверить, входит ли одна в другую (strstr(строка, подстрока))
Д/З
В заданиях разрешается (и рекомендуется!) пользоваться стандартными функциями и l-функциями для строк
EJudge: CharCount 'Количество символов'
Input:Ввести строку размера не больше 1000, подсчитать в ней количество: цифр, строчных букв латиницы, прописных букв латиницы. Вывести результаты подсчета через пробел.
Output:Did you know that for the price of a 280-Z you can buy two Z-80's?
5 40 3
EJudge: WorwFilter 'Особые слова'
Input:Ввести строку размера не больше 1000, состоящую из слов, разделённых одним или несколькими пробелами. Вывести через пробел слова, которые начинаются и оканчиваются одним и тем же символом (если в слове один символ, оно на него и начинается и заканчивается). Массив для хранения строки (если он нужен), объявить глобально.
Output:did you know that
did that
EJudge: CommonPrefix 'Общий префикс'
Input:Ввести построчно несколько строк, вывести длину их общего префикса (попарного сравнения строк-соседей достаточно). Признак конца ввода: EOF. В префикс могут входить любые символы (включая пробелы), кроме перевода строки «\n».
Output:Feral dog Ferrum dwa o tri Ferrari turbo 128
3
EJudge: DrawSquares 'Квадратор'
Input:Квадратор
- ввести положительные w и h — ширина и высота «экрана»
- в цикле вводить 0 или более 4-элементных последовательностей вида (c,X,Y,s), где X и Y — координаты левого верхнего угла квадрата, s — длина его стороны (не меньше 1), а c — символ которым он заполняется на экране. Признак конца ввода: EOF. Для ввода символа-заполнителя используйте в scanf спецификатор "%c".
- вывести прямоугольник из w×h точек, на котором соответствующими символами «нарисованы» квадраты соответствующих размеров в соответствующих местах.
Координаты левого верхнего угла поля — 0,0; координаты растут вправо вниз. Проверять, что квадраты не выходят за границы поля, не надо. Более поздние по порядку ввода квадраты рисуются поверх более ранних. Не занятые квадратами позиции содержат точки "."
Output:20 23 @ 1 1 5 ! 2 3 1 # 4 5 11 / 8 11 9
.................... .@@@@@.............. .@@@@@.............. .@!@@@.............. .@@@@@.............. .@@@###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ......../////////... ......../////////... ......../////////... ......../////////... .................... .................... ....................
