Эта строка копирует нуль-терминированную C-строку в буфер sss без проверки размера: если в sss недостаточно места — поведение неопределено (переполнение буфера). Ключевые числа: длина строки без терминатора strlen("Thisstringistoolong")=23\text{strlen}("This string is too long") = 23strlen("Thisstringistoolong")=23, значит для безопасного копирования нужен буфер минимум 23+1=24 \,23+1=24\,23+1=24 байта. Безопасные варианты: - Убедиться, что sss имеет размер не меньше 24: `char s[24]; strcpy(s, "This string is too long");` - Использовать ограничивающие функции: - `snprintf(s, sizeof s, "%s", "This string is too long");` - (где доступно) `strlcpy(s, "This string is too long", sizeof s);` - `strncpy(s, "This string is too long", sizeof s); s[sizeof s - 1] = '\0';` (учтите особенности `strncpy`) - Выделять динамически: `s = malloc(strlen(src) + 1); strcpy(s, src);` Итог: `strcpy(s, "This string is too long")` безопасна только если размер s≥24s \ge 24s≥24; иначе — UB.
Ключевые числа: длина строки без терминатора strlen("Thisstringistoolong")=23\text{strlen}("This string is too long") = 23strlen("Thisstringistoolong")=23, значит для безопасного копирования нужен буфер минимум 23+1=24 \,23+1=24\,23+1=24 байта.
Безопасные варианты:
- Убедиться, что sss имеет размер не меньше 24: `char s[24]; strcpy(s, "This string is too long");`
- Использовать ограничивающие функции:
- `snprintf(s, sizeof s, "%s", "This string is too long");`
- (где доступно) `strlcpy(s, "This string is too long", sizeof s);`
- `strncpy(s, "This string is too long", sizeof s); s[sizeof s - 1] = '\0';` (учтите особенности `strncpy`)
- Выделять динамически: `s = malloc(strlen(src) + 1); strcpy(s, src);`
Итог: `strcpy(s, "This string is too long")` безопасна только если размер s≥24s \ge 24s≥24; иначе — UB.