Игнорируйте пробелы в функциях sprintf*

#c #printf

Вопрос:

Я хотел бы вывести некоторый текст с помощью этой sprintf_s функции. Вот код:

 sprintf_s(g_msgbuf, "n
            Active Weapon PID: %dn
            HitMode: %sn
            Armor DT: %dn
            Armor DR: %dn", 
            ActiveWeaponPID, 
            HitModeStr.c_str(), 
            cur_dmg_thresh, 
            cur_dmg_resist
        );
 

Как видно из соображений удобочитаемости, я поместил все параметры в отдельные строки. Проблема в том, что я получаю дополнительные нежелательные символы пробела (вкладки), сгенерированные между параметром строки формата:

 Active Weapon PID: 8
            HitMode: single
            Armor DT: 4
            Armor DR: 30
 

Есть ли способ/параметр/опция для функций sprintf ( sprintf_s в частности) игнорировать эти избыточные вкладки?

Ответ №1:

Вы можете использовать тот факт, что отдельные строки будут объединены независимо от того, между какими пробелами/новыми строками находятся — "one" "two" "three" эквивалентно "onetwothree"

 sprintf_s(g_msgbuf, "n"
            "Active Weapon PID: %dn"
            "HitMode: %sn"
            "Armor DT: %dn"
            "Armor DR: %dn", 
            ActiveWeaponPID, 
            HitModeStr.c_str(), 
            cur_dmg_thresh, 
            cur_dmg_resist
        );
 

Ответ №2:

Вот пример использования струнного потока C .

 #include <iostream>
#include <sstream>

std::stringstream g_msgbuf;

int main()
{
    int ActiveWeaponPID{ 4 };
    std::string HitMode{ "none" };
    int cur_dmg_thresh{ 3 };
    int cur_dmg_resist{ 5 };

    g_msgbuf 
        << "Active Waepon PID: " << ActiveWeaponPID << "n"
        << "HitMode: " << HitMode << "n"
        << "Armor DT: " << cur_dmg_thresh << "n"
        << "Armor DR: " << cur_dmg_resist << "n";

    std::cout << g_msgbuf.str();
};
 

Комментарии:

1. @P Крамер «Вам действительно не нужно было лишнее» после » n «» — боюсь, что здесь Вы ошибаетесь. Когда я удаляю » » в конце каждой строки, я получаю ошибку (если только я не использую решение, предложенное Майком выше). Во — вторых — «printf, sprintf больше не считаются «безопасными»» — да, я знаю, поэтому я использую sprintf_s , как вы можете видеть:-)

2. Ладно, тогда мне плохо по части»»;) Да, sprintf_s уже намного лучше, я просто больше не привык видеть какие-либо функции печати. Я не собирался говорить вам, что вы были неправы, просто хотел показать вам альтернативу (и мне нравится < Я обновлю комментарий к » » в ответе.