Обработка ошибок размера буфера в strftime: ERANGE против EOVERFLOWLinux

Ответить
Anonymous
 Обработка ошибок размера буфера в strftime: ERANGE против EOVERFLOW

Сообщение Anonymous »

У меня есть приложение, в котором мне нужно сгенерировать дату и время на основе языкового стандарта, используя 

Код: Выделить всё

strftime
 функция, предоставляемая языком C 

Код: Выделить всё

time.h:
#include 
#include 
#include 
#include
int main()
{
//This is where date & time will be stored
char buffer[10];

// Set Japanese locale for LC_TIME
//Just an example, japanese takes 33 bytes. But the buffer I provided is of 10 bytes
// Installing japanese locale is another effort. So, instead of japanese you can try it by commenting the below setlocale. As even english date & time needs more space than 10.
setlocale(LC_TIME, "ja_JP.UTF-8");

// Initialize struct tm with some value, in this case September 26, 2025, at 12:27:05 PM
struct tm tm1 = {
.tm_sec = 5,
.tm_min = 27,
.tm_hour = 12,
.tm_mday = 26,
.tm_mon = 8,
.tm_year = 125,
.tm_wday = 5,
.tm_yday = 268,
.tm_isdst = 1
};

//In this case, len will be 0.
size_t len = strftime(buffer, sizeof(buffer), "%x %X", &tm1);

//From here, I want to send some error to my application which expects and throws an error to terminal, based on errno.h.
//ERANGE or EOVERFLOW or any other
}
Возвращаемое значение 

Код: Выделить всё

strftime
 будет храниться в 

Код: Выделить всё

rtnValue. Если все пойдет хорошо, storeIn
 будет содержать отформатированную дату и время.
Для разных языков требуются разные размеры буфера. Однако бывают случаи, когда дата и время для данной локали могут превышать размер, указанный параметром 

Код: Выделить всё

len. Эту проблему можно смягчить, предоставив буфер большего размера, но также необходима правильная обработка ошибок.
strftime
 не устанавливает какой-либо конкретный код ошибки, например 

Код: Выделить всё

ERANGE или EOVERFLOW. Вместо этого он возвращает 0
 когда предоставленный буфер слишком мал, что означает, что байты не были записаны. Из-за требований мне нужно установить код ошибки из 

Код: Выделить всё

errno.h. Я путаюсь между ERANGE и EOVERFLOW
.

Код: Выделить всё

EOVERFLOW
 звучит уместно, и я видел некоторые реализации, использующие его при переполнении буфера. Однако в его описании четко указано: «Значение слишком велико для определенных данных», что предполагает, что часть «слишком большая» относится к превышению ограничения типа данных, а не к установленному вручную размеру буфера. Верно ли мое понимание? Если да, то к моему случаю это не относится.
 выдает "Числовой результат вне диапазона" как ошибку, хотя он в основном используется для математических функций, на некоторых веб-сайтах это указывается как входные данные, находящиеся за пределами диапазона, что звучит правильно. Но описание ошибки не соответствует проблеме.
Вопрос:

Какой код ошибки будет наиболее подходящим для такой ситуации?
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -eoverflow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»