Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > sprintf: форматированный вывод


Автор: Alca 26.3.2009, 18:07
sprintf: форматированный вывод, как?

Надо сделать так, чтоб 2-ая колонка была выровняна по левому краю:

row_11111          row_dsfgabcde
row_12                row_dfgsdabcded
row_123345000  row_abcdesdcfsdf
row_1234            row_abcdewer
row_12345          row_abcde

Автор: Acer 26.3.2009, 18:11
Добавляй '\t' или "\t\t" в начале каждой строки второй колонки

Автор: Alca 26.3.2009, 18:15
Цитата

Добавляй '\t' или "\t\t" в начале каждой строки второй колонки

Съезжает строка:
row_11111          row_dsfgabcde
row_12                row_dfgsdabcded
row_123345000  row_abcdesdcfsdf
row_1234            row_abcdewer
row_12345              row_abcde     <<<<<<<<<<<<<

Автор: 586 26.3.2009, 18:20
Код
char buf[260];
sprintf(buf, "'%-10s'", "asdf");
Caption = buf;

Автор: Acer 26.3.2009, 18:38
Цитата(586 @ 26.3.2009,  17:20)
Код
char buf[260];
sprintf(buf, "'%-10s'", "asdf");
Caption = buf;

У меня так не работает...
А вот тако вот:
Код

    sprintf( buf, "Hello %10d \nHello123 %8d", 10, 234 );
    printf( buf );

Только тут придется определять длинну строки, чтобы поставить достаточное количество пробелов...
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html написанно, как оно должно работать.

Автор: 586 26.3.2009, 18:42
Alca, то есть, распечатываешь таблицу в таком формате:
"%-10s %s"

Цитата(Acer @  26.3.2009,  18:38 Найти цитируемый пост)
У меня так не работает...

Какая ОС, какой компилятор? Что выводится в результате?

Автор: Alca 26.3.2009, 18:46
Не %-10s а %+10s.
Поставил для каждой строки свой интервал (+7s, +3s, +5s, ...) - в MessageBox одна строка вылазит, а когда скопировал содержимое бокса в файл, то вылазит другая строка...
 smile

Добавлено через 2 минуты и 43 секунды
Цитата

акая ОС, какой компилятор?

С++ Builder 6.0, WinXP SP3

Автор: Acer 26.3.2009, 18:50
Цитата(586 @ 26.3.2009,  17:42)
Какая ОС, какой компилятор? Что выводится в результате?

ОС - WinXP, компилятор - GCC.
В результате получается вывод строк без форматирования. То есть не в виде таблицы.
Я сделал вот как:
Код

        sprintf( buf, "Row1 %-10s %s \nRow123 %-8s %s", " ", "Column", " ", "Column" );
    printf( buf );

То есть спецификатор %-10s устанавливается для пробелов. Тогда форматируется. Пробелы выводятся перед вторым столбцом

Автор: Alca 26.3.2009, 18:53
http://pic.ipicture.ru/uploads/090326/WDpnSJvt20.png

Автор: Acer 26.3.2009, 18:55
Alca, какой код такое вызывает?

Автор: Alca 26.3.2009, 18:56
Цитата

Alca, какой код такое вызывает?

Это я делаю свою реализацию assert-a...

Автор: 586 26.3.2009, 18:57
Результаты теста: http://codepad.org/dRQXcMhm

Автор: Alca 26.3.2009, 19:00
Цитата

Результаты теста: http://codepad.org/dRQXcMhm

А ты поробуй с двумя, тремя колонками и чтоб строки были разной длины.

Добавлено через 4 минуты и 29 секунд
Мне хотя бы чтоб в мсжбоксе нормально выводило smile 

Автор: 586 26.3.2009, 19:10
Код
#include <stdio.h>

const char *table[][3] =
{ {"aaa", "bbb", "ccc"},
  {"dddd", "e", "fffff"},
  {"ddddddddddddddd", "mmmm", "gggggg"},    // здесь заехало, и это нормально. нужно корректировать длину строки.
  {"", "", "aaaa"}
};

int main(int argc, char* argv[])
{
    int i;
    for(i = 0; i < sizeof(table)/sizeof(table[0]); ++i)
    {
        printf("%-10s %-10s %s\n", table[i][0], table[i][1], table[i][2]);
    }
    getchar();
    return 0;
}

Код

aaa        bbb        ccc
dddd       e          fffff
ddddddddddddddd mmmm       gggggg
                      aaaa

http://codepad.org/3mupZOkM
Цитата
Мне хотя бы чтоб в мсжбоксе нормально выводило

Там шрифт не моноширинный (т.е. буквы разного размера).

Автор: zim22 26.3.2009, 19:40
Цитата(Alca @  26.3.2009,  18:07 Найти цитируемый пост)
sprintf: форматированный вывод, как?

может Вам снова С++ вариант подойдёт smile
Код

using namespace std;
cout << left << setw(10) << "hello" << setw(25) << "IamVeryGladToSeeYou" << setw(5) << "12" <<  endl;
cout << setw(10) << "hello" << setw(25) << "invader" << setw(20)  << "i love you" <<  endl;

Сначала Вы устанавливаете ширину поля, а потом уже записываете внутрь "поля" переменную.
С помощью модификатора left происходит выравнивание по левой границе поля. По правой границе - right

Автор: inside_pointer 28.3.2009, 23:40
там проблем никаких, вот здесь просто, если текст выходит за отведённую границу поля, то её приоритет выше и лишнее отбрасывается

Автор: Alca 29.3.2009, 00:42
Цитата

  force_fmt.tar 10,00 Kb

И где здесь форматирование?

Автор: inside_pointer 29.3.2009, 01:01
какое форматирование ?

Автор: Alca 29.3.2009, 01:17
sprintf: форматированный вывод, выравнивание колонки 

Автор: inside_pointer 29.3.2009, 01:24
а зачем её выравнивать, она всегда будет выравнена с помощью первой

у тебя же строчки съезжают из-за первой колонки, а не из-за второй

Автор: Alca 29.3.2009, 15:51
Цитата

она всегда будет выравнена с помощью первой

Ты попробуй сделать мсжбокс с несколькими колонками и чтоб строки были раЗной длины... smile 

Автор: Alca 29.3.2009, 17:32
И с разными шрифтами...

Автор: inside_pointer 30.3.2009, 01:47
так тут две колонки, если тебе три надо, ты должен выравнивать и первую и вторую, но не третью
а для мсджбокс нужно назначать выравнивание, если там есть параметры, единый формат окна для всех сообщений
а если нету, то перед помещением отформатированной строки, нужно её поместить в отформатированную область, а потом эту область закидывать в мсджбокс

Автор: Alca 31.3.2009, 11:10
http://forum.vingrad.ru/forum/topic-143928.html

Добавлено через 2 минуты и 56 секунд
http://forum.vingrad.ru/forum/topic-161083.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)