C C  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Массивы и строки

Вопросы заставляют различать массив и указатель, считать место для нулевого байта, помнить реальные контракты string.h и проверять вместимость до записи, а не после повреждения памяти.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Сколько элементов в массиве?
CC17
#include <stdio.h>

int main(void) {
    int a[] = {2, 4, 6, 8, 10};
    printf("%zu\n", sizeof a / sizeof a[0]);
}
Вопрос 2 из 20
Почему функция не может вычислить длину переданного массива через `sizeof a / sizeof a[0]`?
CC17
size_t count(int a[]) {
    return sizeof a / sizeof a[0];
}
Вопрос 3 из 20
Что гарантированно находится в a после частичной инициализации?
CC17
int a[4] = {1, 2};
Вопрос 4 из 20
Как объявить указатель на массив из 10 int?
CC17
int matrix[4][10];
/* p должен указывать на одну строку matrix и при p + 1 переходить к следующей строке. */
Вопрос 5 из 20
Какой интерфейс лучше принимает двумерный массив с известным числом столбцов cols во время выполнения?
Вопрос 6 из 20
Какое число элементов вычисляет `sizeof s` для показанного массива `s`?
CC17
char s[] = "hi";
printf("%zu\n", sizeof s);
Вопрос 7 из 20
Почему `char s[2] = "hi";` нельзя передавать strlen?
CC17
char s[2] = "hi";
size_t n = strlen(s);
Вопрос 8 из 20
Что вернёт strlen для строки `"A\0B"`?
CC17
#include <stdio.h>
#include <string.h>

int main(void) {
    char s[] = "A\0B";
    printf("%zu\n", strlen(s));
}
Вопрос 9 из 20
Как безопасно превратить полученные n байтов в C-строку в буфере вместимости cap?
CC17
ssize_t n = read(fd, buf, cap);
/* сделать строку только при достаточном месте */
Вопрос 10 из 20
Когда представление “указатель + длина” предпочтительнее C-строки?
Вопрос 11 из 20
Какую функцию нужно использовать для перекрывающихся диапазонов?
CC17
char s[] = "abcdef";
/* сдвинуть первые 4 байта на одну позицию вправо */
???(s + 1, s, 4);
Вопрос 12 из 20
Что означает отрицательный результат strcmp(a, b)?
Вопрос 13 из 20
Почему `strncpy(dst, src, sizeof dst)` не является универсальной безопасной заменой `strcpy`?
CC17
char dst[8];
strncpy(dst, src, sizeof dst);
Вопрос 14 из 20
Какой вызов сравнивает ровно первые n байтов, не требуя нуль-терминатора?
CC17
int same_block(const unsigned char *a, const unsigned char *b, size_t n) {
    return /* ... */;
}
Вопрос 15 из 20
Почему результат strlen нельзя хранить в int без проверки?
Вопрос 16 из 20
Сколько байтов нужно выделить для копии строки s?
CC17
char *copy = malloc(/* размер */);
strcpy(copy, s);
Вопрос 17 из 20
Как правильно проверить результат snprintf?
CC17
int r = snprintf(buf, cap, "%s:%d", name, id);
Вопрос 18 из 20
Какое условие безопасно проверяет размер для массива из count элементов по elem_size?
CC17
size_t bytes;
/* проверить count * elem_size */
Вопрос 19 из 20
Почему `sprintf(buf, "%s", input)` опасен для внешних входных данных?
CC17
char buf[64];
sprintf(buf, "%s", input);
Вопрос 20 из 20
Функция должна дописать suffix к dst. Какой первый шаг обязателен?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу