Проблемы с правильным форматированием printf в C ++ - PullRequest
0 голосов
/ 05 августа 2020

Хотя это C ++, я использую printf, потому что лаборатория, которую я выполняю, требует этого. Я нахожусь в затруднительном положении, когда я не могу понять, как правильно отформатировать следующее:

printf("     %-6s  x%d, x%d // %08x\n", lookup(inst.opc_keys, inst.opc, inst.opc_vals).c_str(), inst.rd, inst.imm, list[i]);

Переменные произвольны для простоты, но я пытаюсь отформатировать это так, чтобы // %08x - это всегда то же количество места, что и остальная часть оператора.

Идеальный пример вывода был бы:

addi     x4, x4, -12       // 0xfffff
addi     x4, x4, 2000      // 0xffffa

Но в том виде, в котором он у меня есть сейчас, он будет напечатан вот так:

addi     x4, x4, -12 // 0xfffff
addi     x4, x4, 20000 // 0xffffa

Еще раз, инструкции / числа здесь произвольны - просто используя это в качестве примера. Как мне правильно отформатировать это с помощью printf? (т.е. без iostream)

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

x%d, %-15d, чтобы заполнить последнее целое число справа контейнером из 15 символов. Это обеспечит равные пробелы.

printf("     %-6s  x%d, %-15d // %08x\n", lookup(inst.opc_keys, inst.opc, inst.opc_vals).c_str(), inst.rd, inst.imm, list[i]);
1 голос
/ 05 августа 2020

Начните с записи первой части во временный массив:

char tmp[30];
sprintf(tmp, "%6s  x%d, x%d, %d", 
        lookup(inst.opc_keys, inst.opc,inst.opc_vals).c_str(), inst.rd, inst.imm, other);

Затем выведите эту строку, выровненную по левому краю, а затем комментарий:

printf("%-25s // %08x\n", tmp, list[i]);
...