Вызываете `strcat` и можете сохранить строку большего размера в меньшую? - PullRequest
0 голосов
/ 16 декабря 2018

Как можно сохранить все str2, которые имеют размер 5, в str1, которые имеют только размер 2?

Могу ли я взломать систему?

Состояние учебника:убедитесь, что str1 должно иметь большее значение для хранения str2, но почему?

#include <iostream>
#include <cstring>

int main()
{
    char str1[2] = {'B', '\0'};
    char str2[5] = {'c', 'o', 'l', 'l', '\0'};
    std::strcat(str1, str2);
    std::cout << str1 << std::endl;

    return 0;
}

1 Ответ

0 голосов
/ 16 декабря 2018

Итак, у вас есть это в стеке:

str1 ---> [X, X]
str2 ---> [Y, Y, Y, Y, Y]

Где каждый X и Y являются одиночными char объектами (т.е. обычно каждый байт памяти).

Когда вы звоните strcat(str1, str2), вы просите поставить 5 Y с, начиная с первого \0 в str1 (до первого \0 в str2, который в данном случае является последним).

Итак, первый Y переходит во вторую часть str1, что нормально:

str1 ---> [X, Y]
str2 ---> [Y, Y, Y, Y, Y]

Но тогда strcat продолжит запись вне массива другогоОсталось 4 Y s, то есть он "попробует" следующее:

str1 ---> [X, Y] Y, Y, Y, Y
str2 ---> [Y, Y, Y, Y, Y]

Это ошибка, которая вызывает неопределенное поведение, что означает, что ваша программа имеет ошибку (что происходит точно, зависит:может привести к сбою, неправильному поведению или просто к счастью).

Как говорится в вашем учебнике, решение состоит в том, чтобы str1 был достаточно большим, чтобы вместить, по крайней мере, все:

str1 ---> [X, Y, Y, Y, Y, Y]
str2 ---> [Y, Y, Y, Y, Y]

Другими словами, str1 должен быть массивом не менее 6 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...