#c #overflow
#c #переполнение
Вопрос:
Я прохожу через K amp; R, и 3-2 выглядит так, что было бы легко попасть в переполнение буфера
Напишите функцию escape(s, t), которая преобразует символы, такие как новая строка и табуляция, в видимые escape-последовательности, такие как n и t, при копировании строки t в s. Используйте переключатель
Если я заменю байт ‘ n’ на » и ‘n’, размер s потенциально может быть немного больше исходной строки.
Я мог бы просто написать эту программу и игнорировать переполнение, но я бы предпочел этого не делать.
У меня возникла проблема с тем, как с этим справиться?
Я думаю, имея фиксированный размер буфера, возможно, что-то из limit.h, и сбрасывая буфер в стандартный формат, когда он заполняется?
Комментарии:
1. Какие бывают типы s и t?
2. Пока нет указателей, поэтому char s[], char t[]
Ответ №1:
Я полагаю, что весь смысл упражнения в том, чтобы научить вас, что когда вы имеете дело с чем-то подобным, вам либо нужно:
- Слишком высокая загрузка (увеличение размера буфера вдвое по сравнению с исходным)
- Потратьте дополнительное время (дополнительный проход) и предварительно вычислите требуемый размер буфера.
Комментарии:
1. 1.5. Начните с эвристического, «вероятного» размера буфера. Начинайте работать над этим и копируйте его в новый буфер только тогда, когда вы собираетесь его переполнить.
2. @Ates: Это худшее из обоих миров … амортизированная хорошая производительность полезна только тогда, когда ни одно конкретное приложение не может каждый раз работать в худшем случае. Кроме того, этот подход требует наибольших усилий при программировании.
Ответ №2:
s никогда не будет длиннее, чем в два раза больше длины t . Поскольку это упражнение, по-видимому, предназначено для того, чтобы помочь вам научиться использовать switch
, я думаю, было бы неплохо предположить, что вызывающий передает строку в s достаточной длины. Или, если s имеет тип char ** (или аналогичный), то вы должны выделить строку, и в этом случае вы можете выделить строку надлежащего размера.
В реальной функции у вас, вероятно, был бы другой параметр, который указывает максимальную длину строки назначения.
Ответ №3:
попробуйте добавить параметр size, чтобы узнать размер целевого буфера. Если вы передадите указатель на этот параметр, вы можете вернуть какое-то значение ошибки, если буфер слишком мал, и передать необходимый размер обратно через параметр size. Что-то вроде:
int escape(size_t *size, char *out, const char *in);