Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: непонятно? откуда берется пробел в массиве символов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Alex_Golubev
Привет.
Прям не знаю как так получается.
Пишу:
CODE
sprintf(print_buf,"Доб.вода.....%2.0f%%\n",Water);

Где print_buf массив типа char размерностью 32.
После получаю:

CODE
print_buf    <array>"Доб.вода..... 0%
"    0x20000BC4    char[32]    
[0]    'Д' (0xC4)    0x20000BC4    char    
[1]    'о' (0xEE)    0x20000BC5    char    
[2]    'б' (0xE1)    0x20000BC6    char    
[3]    '.' (0x2E)    0x20000BC7    char    
[4]    'в' (0xE2)    0x20000BC8    char    
[5]    'о' (0xEE)    0x20000BC9    char    
[6]    'д' (0xE4)    0x20000BCA    char    
[7]    'а' (0xE0)    0x20000BCB    char    
[8]    '.' (0x2E)    0x20000BCC    char    
[9]    '.' (0x2E)    0x20000BCD    char    
[10]    '.' (0x2E)    0x20000BCE    char    
[11]    '.' (0x2E)    0x20000BCF    char    
[12]    '.' (0x2E)    0x20000BD0    char    
[13]    ' ' (0x20)    0x20000BD1    char    
[14]    '0' (0x30)    0x20000BD2    char    
[15]    '%' (0x25)    0x20000BD3    char    
[16]    '\n' (0x0A)    0x20000BD4    char    
[17]    '\0' (0x00)    0x20000BD5    char    
[18]    '\0' (0x00)    0x20000BD6    char    
[19]    '\0' (0x00)    0x20000BD7    char    
[20]    '\0' (0x00)    0x20000BD8    char    
[21]    '\0' (0x00)    0x20000BD9    char    
[22]    '\0' (0x00)    0x20000BDA    char    
[23]    '\0' (0x00)    0x20000BDB    char    
[24]    '\0' (0x00)    0x20000BDC    char    
[25]    '\0' (0x00)    0x20000BDD    char    
[26]    '\0' (0x00)    0x20000BDE    char    
[27]    '\0' (0x00)    0x20000BDF    char    
[28]    '\0' (0x00)    0x20000BE0    char    
[29]    '\0' (0x00)    0x20000BE1    char    
[30]    '\0' (0x00)    0x20000BE2    char    
[31]    '\0' (0x00)    0x20000BE3    char


Откуда в 13-й ячейке пробел?
SSerge
Двойка в формате "%2.0f" задаёт ширину поля для вывода не менее 2 символов.
Alex_Golubev
А есть возможность убирать этот пробел?
novikovfb
Цитата(Alex_Golubev @ Jun 27 2017, 11:43) *
А есть возможность убирать этот пробел?

Использовать формат "%1.0f"
Alex_Golubev
формат "%1.0f" не пойдет так как число состоит из двух знаков.
novikovfb
Цитата(Alex_Golubev @ Jun 27 2017, 11:55) *
формат "%1.0f" не пойдет так как число состоит из двух знаков.

насколько помню, при нехватке произойдет автоматическое расширение, т.е. 1 показывает минимальную длину печатаемого числа, но не максимальную.
k155la3
попробуйте %02.0f
Отображаться должно 01 (вместо пробела будет ведущий ноль). Могу ошибаться.
Если уж совсем не получится - "дообработайте" массив после печати, например замените пробел на тотже 0 == 0x30.
( позиция его в массиве фиксирована - если не менять строку-литерал)
Сергей Борщ
QUOTE (k155la3 @ Jun 27 2017, 12:37) *
"дообработайте" массив после печати
Чего народ только не придумает, лишь бы не читать документацию.
k155la3
Цитата(Сергей Борщ @ Jun 27 2017, 14:53) *
Чего народ только не придумает, лишь бы не читать документацию.


Код
%-2.0f

Alex_Golubev
А как можно сделать выравнивания текста с правой стороны, а цифр с левой как на магазином чеке?
Код
|вода.....100%  |
|жир......10,56 |
|Белок....3,1   |
Сергей Борщ
QUOTE (Alex_Golubev @ Jun 28 2017, 07:55) *
А как можно сделать выравнивания текста с правой стороны, а цифр с левой
Вы издеваетесь? Двумя сообщениями выше дал ссылку на полное описание форматной строки printf, даже на русском языке. "Чтение документации из интернета вслух - 100 евро/час":
QUOTE
Знак | Название знака | Значение | В отсутствие этого знака
- | минус | выводимое значение выравнивается по левому краю в пределах минимальной ширины поля | по правому
Количество точек можно выводить как строку из максимально возможного количества точек, смещая адрес начала строки на длину названия:
CODE
printf("%s%s", item_name[i], "........." + strlen(item_name[i]));
Genadi Zawidowski
Не забываем про малоизвестные (но стандартные) коды %n и %*s в разных вариантах.


Пример со звездочкой для выравнивания на нужную позицию:
Код
static int
toprintc(int c)
{
    if (c < 0x20 || c >= 0x7f)
        return '.';
    return c;
}

void
printhex(unsigned long voffs, const unsigned char * buff, unsigned length)
{
    unsigned i, j;
    unsigned rows = (length + 15) / 16;

    for (i = 0; i < rows; ++ i)
    {
        const int trl = ((length - 1) - i * 16) % 16 + 1;
        debug_printf_P(PSTR("%08lX "), voffs + i * 16);
        for (j = 0; j < trl; ++ j)
            debug_printf_P(PSTR(" %02X"), buff [i * 16 + j]);

        debug_printf_P(PSTR("%*s"), (16 - trl) * 3, "");

        debug_printf_P(PSTR("  "));
        for (j = 0; j < trl; ++ j)
            debug_printf_P(PSTR("%c"), toprintc(buff [i * 16 + j]));

        debug_printf_P(PSTR("\n"));
    }
}
sigmaN
Код
printf("%s%s", item_name[i], "........." + strlen(item_name[i]));

А вот это уже интересно.
Респект Сергаю, лайк тому, кто понял как это работает wink.gif
RabidRabbit
Цитата(sigmaN @ Jun 28 2017, 22:19) *
Код
printf("%s%s", item_name[i], "........." + strlen(item_name[i]));

А вот это уже интересно.
Респект Сергаю, лайк тому, кто понял как это работает wink.gif

Дизлайк тому, кто такое использует в коде sm.gif Прикольно ведь, когда очередной айтем_нэйм окажется длиннее 9 символов sm.gif Да, да, я понимаю, это для названий пунктов меню, которые все короче 10 символов...
skripach
del
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.