Причина неправильного вывода связана со вторым оператором snprintf()
, который печатает до начала tmp_str
, а не после того, где остановился первый snprintf()
. Вот модифицированная версия, которая печатает правильный вывод.
#include <stdio.h>
#include <string.h>
static void print_info(char *product_name, int type)
{
char tmp_str[512] = {0};
char tmp_product[17] = {0};
memcpy(tmp_product, product_name, strlen(product_name));
snprintf(tmp_str, (sizeof(tmp_str) - 1),
"Product: %s",
tmp_product);
if (type > 10)
snprintf(&tmp_str[strlen("Product: ") + strlen(product_name)]+1,
(sizeof(tmp_str) - 1 - strlen("Product: ") - strlen(product_name) - 1),
"%s, type: %u", tmp_str,
type);
printf("product info: %s\n", tmp_str);
}
int main()
{
print_info("productA", 20);
}
Здесь во втором операторе snprintf()
мы печатаем в &tmp_str[strlen("Product: ") + strlen(product_name) + 1
, который является адресом памяти после первого оператора snprintf()
.
Редактировать
Примечание. Код выглядит немного неуклюже, и он предназначен для того, чтобы понять, почему был введен неправильный вывод. Ответ niry затрагивает другие вопросы кода и является более кратким.