Перейти к содержанию
    

непонятно? откуда берется пробел в массиве символов

Привет.

Прям не знаю как так получается.

Пишу:

sprintf(print_buf,"Доб.вода.....%2.0f%%\n",Water);

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

После получаю:

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-й ячейке пробел?

Изменено пользователем Сергей Борщ
Исправил орфографию в названии темы и собщении

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

формат "%1.0f" не пойдет так как число состоит из двух знаков.

насколько помню, при нехватке произойдет автоматическое расширение, т.е. 1 показывает минимальную длину печатаемого числа, но не максимальную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробуйте %02.0f

Отображаться должно 01 (вместо пробела будет ведущий ноль). Могу ошибаться.

Если уж совсем не получится - "дообработайте" массив после печати, например замените пробел на тотже 0 == 0x30.

( позиция его в массиве фиксирована - если не менять строку-литерал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"дообработайте" массив после печати
Чего народ только не придумает, лишь бы не читать документацию.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чего народ только не придумает, лишь бы не читать документацию.

 

%-2.0f

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как можно сделать выравнивания текста с правой стороны, а цифр с левой как на магазином чеке?

|вода.....100%  |
|жир......10,56 |
|Белок....3,1   |

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как можно сделать выравнивания текста с правой стороны, а цифр с левой
Вы издеваетесь? Двумя сообщениями выше дал ссылку на полное описание форматной строки printf, даже на русском языке. "Чтение документации из интернета вслух - 100 евро/час":

Знак | Название знака | Значение | В отсутствие этого знака

- | минус | выводимое значение выравнивается по левому краю в пределах минимальной ширины поля | по правому

Количество точек можно выводить как строку из максимально возможного количества точек, смещая адрес начала строки на длину названия:

printf("%s%s", item_name[i], "........." + strlen(item_name[i]));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не забываем про малоизвестные (но стандартные) коды %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"));
    }
}

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

printf("%s%s", item_name[i], "........." + strlen(item_name[i]));

А вот это уже интересно.

Респект Сергаю, лайк тому, кто понял как это работает ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

printf("%s%s", item_name[i], "........." + strlen(item_name[i]));

А вот это уже интересно.

Респект Сергаю, лайк тому, кто понял как это работает ;)

Дизлайк тому, кто такое использует в коде :) Прикольно ведь, когда очередной айтем_нэйм окажется длиннее 9 символов :) Да, да, я понимаю, это для названий пунктов меню, которые все короче 10 символов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...