Проблема переполнения K

#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. Слишком высокая загрузка (увеличение размера буфера вдвое по сравнению с исходным)
  2. Потратьте дополнительное время (дополнительный проход) и предварительно вычислите требуемый размер буфера.

Комментарии:

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);