Склейка строк
Часто нужно собрать текст из частей: имя и фамилию, приветствие и имя. Функция strcat (string concatenate, «склеить строки») из string.h дописывает текст в конец того, что уже лежит в массиве:
char full_name[30] = "Anna";
strcat(full_name, " ");
strcat(full_name, "Smith");
printf("%s\n", full_name);Это выведет:
Anna Smithstrcat находит '\0' в конце full_name и копирует новый текст туда, вместе с его собственным '\0'. Порядок такой же, как у strcpy: сначала массив, который меняется, потом текст, который нужно добавить. Второй текст остаётся таким, как был.
Обычно начинают с пустой строки "", в которой лежит только '\0', и добавляют части по одной. Это удобно в цикле:
char stars[10] = "";
for (int i = 0; i < 3; i++) {
strcat(stars, "*");
printf("%s\n", stars);
}Это выведет:
*
**
***В массиве должно быть место для всего: текста, который в нём уже лежит, нового текста и одного '\0'. Для "Anna Smith" нужно 4 + 1 + 5 + 1 = 11 элементов, так что full_name[30] более чем достаточно. Как и с strcpy, программа здесь не компилируется, если Clang видит, что новый текст не поместится:
char greeting[8] = "Hello";
strcat(greeting, ", world!");main.c:6:5: error: 'strcat' will always overflow; destination buffer has size 8, but the source string has length 9 (including NUL byte) [-Werror,-Wfortify-source]Но Clang проверяет только новый текст. Когда массив уже частично заполнен, он часто не замечает проблемы, и strcat молча записывает данные за концом массива. Поэтому перед склейкой подсчитайте, сколько места нужно, а если не уверены, сделайте массив побольше.
Задание
- 1
Перед последним
printfсклейтеfirst_name, пробел иlast_nameвfull_name, трижды вызвавstrcat. В выводе должно бытьИмя: Tom Baker. - 2
Ниже создайте
char laugh[20] = "";и в циклеfor, который выполняется 4 раза, добавляйте к нему"ha". После цикла выведите его:hahahaha.