Конкатенация в строку - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу объединить в строку на основе выполненного условия

Вот код, который я пробовал:

#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);
}

когда я запускаю его, я получаю информацию о продукте: Product: productA

Но когда я пытаюсь print_info («productA», 20); Я хотел получить

информация о продукте: продукт: productA 20 Но я получаю: информация о продукте:, тип: 20

Есть идеи?

Спасибо, KW

Ответы [ 2 ]

1 голос
/ 30 апреля 2019
  1. используйте strlen (), чтобы выяснить фактический размер строки
  2. вы не можете использовать вход sprintf в качестве вывода
  3. вы должны проверить на наличие strlen <выделенных пробелов (некоторые включеныв коде ниже, спасибо Джонатану - комментарий выше) </li>

Вот рабочий код:

#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);
}
0 голосов
/ 30 апреля 2019

Причина неправильного вывода связана со вторым оператором 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 затрагивает другие вопросы кода и является более кратким.

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