连接到字符串

时间:2019-04-30 03:24:24

标签: c

我想根据满足的条件连接到字符串

这是我尝试的代码:

#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

有什么想法吗?

谢谢, 千瓦

2 个答案:

答案 0 :(得分:1)

  1. 使用strlen()找出字符串的实际大小
  2. 您不能将sprintf输入用作输出
  3. 您应检查是否有不足的<已分配空间(以下代码中包含一些空间,感谢Jonathan-上面的评论)

这是一个有效的代码:

#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的答案解决了代码的其他问题,而且更为简洁。