sprintf_s вылетает - PullRequest
       1

sprintf_s вылетает

1 голос
/ 05 мая 2011

Я получаю сбой при выполнении следующего кода в sprintf_s.Этот код работал много лет без проблем.Когда я указал размер в strcat_s и sprintf_s, как в приведенных ниже инструкциях, сбой не появлялся.В чем может быть причина этого?

strcat_s (sztmpCurrDate, 100 , sztmpCurrTime);sprintf_s (sztmpCurrDate, 100 , "% s:% 0.3d", sztmpCurrDate, curTime.wMilliseconds););

char sztmpCurrDate[100] = "";
char sztmpCurrTime[100] = "";
SYSTEMTIME curTime;
GetLocalTime(&curTime); 
GetLocalTime(&curTime); 
GetDateFormat(LOCALE_USER_DEFAULT,
                                DATE_SHORTDATE,
                                &curTime,
                                NULL,
                                sztmpCurrDate,
                                100);

GetTimeFormat(LOCALE_USER_DEFAULT,
                          TIME_FORCE24HOURFORMAT,
                          &curTime,
                          "HH':'mm':'ss",
                          sztmpCurrTime,
                          100);

strcat_s(sztmpCurrDate," ");
strcat_s(sztmpCurrDate,sztmpCurrTime);
sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);

Ответы [ 4 ]

4 голосов
/ 05 мая 2011

Из документации для sprintf_s:

Если копирование происходит между перекрывающимися строками, поведение не определено.

Ваш код:

sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);

копирует из источника в место назначения sztmpCurrDate. Кроме того, вы не указали размер строки назначения, который требуется для sprintf_s (я не знаю, как ваш код даже компилировался таким образом). Попробуйте:

sprintf_s(sztmpCurrDate + strlen(sztmpCurrDate), 100-strlen(sztmpCurrDate),
          ":%0.3d",curTime.wMilliseconds);

Лучшим подходом, так как вы используете C ++, является использование std::string, и тогда вам не придется беспокоиться об ошибке такого рода при обработке строки C.

1 голос
/ 10 мая 2016

Неверный синтаксис !!!

Второй аргумент sprintf_s - это длина вашего буфера , а в случае сбоя программы вы указали указатель на строку C (char *) . Это абсолютно синтаксическая ошибка.

Компилятор, вероятно, выдал предупреждение, но, к сожалению, позволил этому пройти. Это потому, что sprintf_s принимает три аргумента + переменное количество аргументов. В неправильном случае вы предоставили три аргумента, чтобы компилятор был удовлетворен, но он обработал вашу «строку формата» как «число аргументов», а sztmpCurrDate как «строку формата».

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

0 голосов
/ 05 мая 2011

Возможно, вы используете неправильную версию:

sprintf_s(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);

Вместо этого должно быть:

int slen = strlen(sztmpCurrDate) + 1;

sprintf_s(sztmpCurrDate, slen, "%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);

Обратитесь к этому sprintf_s для получения дополнительной информации.

0 голосов
/ 05 мая 2011

Код работал правильно, код не правильный.

sprintf(sztmpCurrDate,"%s:%0.3d",sztmpCurrDate,curTime.wMilliseconds);

Переписать как

sprintf(&sztmpCurrDate[strlen(sztmpCurrDate)],"%0.3d",curTime.wMilliseconds);

А для домашней работы расскажи почему .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...