|
|
  |
непонятно? откуда берется пробел в массиве символов |
|
|
|
Jun 26 2017, 05:06
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877

|
Привет. Прям не знаю как так получается. Пишу: 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-й ячейке пробел?
Сообщение отредактировал Сергей Борщ - Jun 27 2017, 15:47
Причина редактирования: Исправил орфографию в названии темы и собщении
|
|
|
|
|
Jun 27 2017, 11:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (k155la3 @ Jun 27 2017, 12:37)  "дообработайте" массив после печати Чего народ только не придумает, лишь бы не читать документацию.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 28 2017, 04:55
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877

|
А как можно сделать выравнивания текста с правой стороны, а цифр с левой как на магазином чеке? Код |вода.....100% | |жир......10,56 | |Белок....3,1 |
Сообщение отредактировал Alex_Golubev - Jun 28 2017, 05:00
|
|
|
|
|
Jun 28 2017, 05:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Alex_Golubev @ Jun 28 2017, 07:55)  А как можно сделать выравнивания текста с правой стороны, а цифр с левой Вы издеваетесь? Двумя сообщениями выше дал ссылку на полное описание форматной строки printf, даже на русском языке. "Чтение документации из интернета вслух - 100 евро/час": QUOTE Знак | Название знака | Значение | В отсутствие этого знака - | минус | выводимое значение выравнивается по левому краю в пределах минимальной ширины поля | по правому Количество точек можно выводить как строку из максимально возможного количества точек, смещая адрес начала строки на длину названия: CODE printf("%s%s", item_name[i], "........." + strlen(item_name[i]));
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 28 2017, 18:39
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Не забываем про малоизвестные (но стандартные) коды %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 - Jun 28 2017, 18:45
|
|
|
|
|
Jun 29 2017, 06:22
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040

|
Цитата(sigmaN @ Jun 28 2017, 22:19)  Код printf("%s%s", item_name[i], "........." + strlen(item_name[i])); А вот это уже интересно. Респект Сергаю, лайк тому, кто понял как это работает  Дизлайк тому, кто такое использует в коде  Прикольно ведь, когда очередной айтем_нэйм окажется длиннее 9 символов  Да, да, я понимаю, это для названий пунктов меню, которые все короче 10 символов...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|