我想根据满足的条件连接到字符串
这是我尝试的代码:
#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, sizeof(product_name));
snprintf(tmp_str, (sizeof(tmp_str) - 1),
"Product: %s",
tmp_product);
if (type > 10)
snprintf(tmp_str, (sizeof(tmp_str) - 1),
"%s, type: %u", tmp_str,
type);
printf("product info: %s\n", tmp_str);
}
int main()
{
print_info("productA", 2);
}
当我运行它时,我得到产品信息:产品:productA
但是当我尝试 print_info(“ productA”,20); 我想得到
产品信息:产品:productA 20 但是我得到: 产品信息:,类型:20
有什么想法吗?
谢谢, 千瓦
答案 0 :(得分:1)
这是一个有效的代码:
#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));
int len = snprintf(tmp_str, sizeof(tmp_str), "Product: %s", tmp_product);
if (type > 10)
snprintf(tmp_str + len, sizeof(tmp_str) - len, ", type: %u", type);
printf("product info: %s\n", tmp_str);
}
int main() {
print_info("productAaaa", 20);
}
答案 1 :(得分:-1)
输出不正确的原因是由于第二条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的答案解决了代码的其他问题,而且更为简洁。