Если вы попытаетесь точно вычислить размер адресата для вызова sprintf
, вплоть до последнего байта, у вас будут постоянно такие проблемы. Попытка быть настолько скрупулезным по отношению к каждому последнему байту - это «ложная экономия» и, как правило, огромная трата времени.
Если вы не программируете для микроконтроллера 1960-х или чего-то еще, сделайте себе одолжение и выделитеНа 10-50% больше, чем нужно. Если бы вы объявили
char today[15];
char ten_years[15];
, большинство ваших проблем просто исчезло бы сразу.
Однако переполнение буфера - огромная проблема. Итак, есть второе, еще более важное исправление, которое вы должны сделать. Замените эти вызовы на sprintf
гораздо более безопасными snprintf
:
snprintf( today, sizeof(today), "%04d%02d%02d\n", year, month, day );
snprintf( ten_years, sizeof(ten_years), "%04d%02d%02d\n", tenyear, month, day );
Помимо указателя буфера, snprintf
также принимает аргумент, определяющий размер этого буфера, поэтомучто он может быть уверен, что не переполнит его.
Еще одна вещь: это не имеет никакого отношения к вашей проблеме переполнения буфера, но есть еще одна довольно серьезная проблема в вашем коде, а именно строка
year = (tm->tm_year%100)+2000;
Поле tm_year
определено так, чтобы содержать год - 1900 . Это, по общему признанию, странное определение, но это означает, что правильный способ восстановить правильный четырехзначный год - это просто сделать
year = tm->tm_year + 1900;
Код, который вы использовали, будет вычислять неправильный год для дат 1900-х годов. или 2100-е, или любая дата не в 2000-х.