По моему опыту, при записи главным образом приложений для Клиента/сервера WinForms это простые заключения, в которые я приехал:
Хранимые процедуры Использования:
специальные запросы Использования:
В большинстве моих приложений я использовал и и специальный sql SP, хотя я нахожу, что использую SP все меньше и меньше, поскольку они заканчивают тем, что были кодом точно так же, как C#, только тяжелее к управлению версиями, тесту, и поддерживают. Я рекомендовал бы использовать специальный sql, если Вы не можете найти определенную причину не к.
Как уже говорили другие, в этом случае вам не понадобится -1. Если размер массива фиксированный, я бы использовал вместо него strncpy
. Он был сделан для копирования строк - sprintf
был сделан для сложного форматирования. Однако, если размер массива неизвестен или вы пытаетесь определить, сколько памяти необходимо для форматированной строки. Это то, что мне действительно нравится в стандартной версии snprintf
:
char* get_error_message(char const *msg) {
size_t needed = snprintf(NULL, 0, "%s: %s (%d)", msg, strerror(errno), errno);
char *buffer = malloc(needed+1);
sprintf(buffer, "%s: %s (%d)", msg, strerror(errno), errno);
return buffer;
}
Объедините эту функцию с va_copy
, и вы сможете создавать очень безопасные операции с форматированными строками.
Вам не нужно -1, поскольку в ссылке указано:
Функции snprintf () и vsnprintf () не писать больше, чем размер в байтах (включая конечный '\ 0').
Обратите внимание на "включая завершающую '\ 0'" часть
Нет необходимости в -1. C99 snprintf
всегда завершается нулем. Аргумент размера определяет размер выходного буфера , включая нулевой терминатор . Таким образом, код становится
char err_msg[32];
int ret = snprintf(err_msg, sizeof err_msg, "[ ST_ENGINE_FAILED ]");
ret
содержит фактическое количество напечатанных символов ( без нулевого терминатора).
Однако, не путайте с Microsoft _snprintf
(pre-C99), который не завершает нуль, и, в этом отношении, имеет совершенно другое поведение (например, возвращает -1
вместо предполагаемой длины в случае, если буфер недостаточно велик). Если вы используете _snprintf
, вы должны использовать тот же код, что и в вашем вопросе.
В данном примере вам следует сделать следующее:
char err_msg[32];
strncpy(err_msg, "[ ST_ENGINE_FAILED ]", sizeof(err_msg));
err_msg[sizeof(err_msg) - 1] = '\0';
или даже лучше:
char err_msg[32] = "[ ST_ENGINE_FAILED ]";
Согласно snprintf (3)
:
Функции
snprintf ()
иvsnprintf ()
не пишут большеразмера
байт (включая завершающий'\ 0'
).
sizeof вернет количество байтов, которое тип данных будет использовать в памяти, а не длину строки. Например, sizeof (int) возвращает 4 байта в 32-битной системе (ну, я думаю, в зависимости от реализации). Поскольку вы используете константу в своем массиве, вы можете передать ее в printf.