Что касается форматирования вывода с использованием strcat - PullRequest
0 голосов
/ 11 ноября 2010

Мне нужна помощь в преобразовании следующего формата с использованием функции strcat вместо s Printf.

const char* const MSG_STAMP_PRINTF_FORMAT = "%c %04d-%02d-%02d %02d:%02d:%02d.%03d";

char cMsgStamp[500];
char cSevChr = 'I'; 

struct tm gmt;

// Calculate Day/Hour/Min/Sec
gmtime_r((time_t *)&pMsg->iSysTimeSec, &gmt);

int iSysTimeMs = 100;

// Format the begining of the message, the message stamp

sprintf(&cMsgStamp[0],
         MSG_STAMP_PRINTF_FORMAT,
         cSevChr, gmt.tm_year+1900, gmt.tm_mon + 1, gmt.tm_mday, gmt.tm_hour, gmt.tm_min, gmt.tm_sec,iSysTimeMs
             ); is 0x%s\n", n3);

вместо использования sprintf, я должен получить ту же информацию, которая присутствует в cMsgStamp выше, используя количество функций strcat.

Может ли кто-нибудь помочь мне в этом. Спасибо! Венката РКА

1 Ответ

0 голосов
/ 11 ноября 2010

Вам нужно написать одну вспомогательную функцию, которая, учитывая целое число n, число цифр d и буфер, который является «достаточно большим» (по крайней мере, n + 1 байт), выполняет работуформатирования "% 04d" и т. д. Эта функция может использовать strcat(), но, вероятно, не будет.

Вам нужна основная функция, которая может шагать по строке формата, изолируя разные биты (в основном, есть% -последовательности и другие символы) и их обработка соответствующим образом.Это может использовать strcat(), но, вероятно, не будет, если у вас нет двух используемых буферов - один для хранения временных результатов от первой (вспомогательной) функции и один для конечного результата.(Я не вижу необходимости использовать два буфера, но это послужило бы оправданием для использования strcat().)

Убедитесь, что основной функции сообщается, насколько велик размер буфера и что он делаетне переполняет границы своего буфера.Использовать strcat() (или strncat()) всегда безопасно, только если вы точно знаете, сколько данных находится в буфере, в который вы копируете, сколько данных в строке, которую вы добавляете, и точно, какой длины буфера вы используете.Используем это вообще.И, в частности, интерфейс к strncat() вызывает катастрофу - последний аргумент (размер) не является размером целевого буфера (как это происходит в большинстве аналогичных вызовов);это количество свободного места в буфере.

...