Использование Sprintf() для левой строки?

Я занимался этим весь день, и никак не могу понять, как использовать sprintf() для установки ширины строки, чтобы мои символы были выровнены по правому краю.

Что я пытаюсь сделать, так это сдвинуть вывод вправо на сенсорном экране, когда значение положительное.
Моя выходная строка всегда имеет предсказуемую длину, поэтому кажется, что это должно быть легко.
Я попытался объединить строку только с пробелом в ней и любым другим способом, который я мог придумать, чтобы добавить пробел в начало моей строки. Не повезло.

char stringval[8] = 1.08;
char juststringval[8];
            if (hashpos > 0 && hashpos < 10) { 

                sprintf(juststringval,  " %5s" , stringval);
                Serial.println(juststringval);
            }

вывод:

1.08 (no spaces in front)

Если вам интересно, почему мне нужно использовать строку, мой сенсорный экран будет печатать с плавающей запятой, но моя библиотека не будет вращать их должным образом.
Только строки можно поворачивать так, как мне нужно.

Разве нет простого способа сделать это?

ИЗМЕНИТЬ:

Кажется, я могу использовать трюк с шириной, если я добавляю какой-то символ помимо пустого места.
Например:

void setup()
{
char stringval[33] = "1.08";
char juststringval[33];
char space[] = "rr";         ////ЭТО РАБОТАЕТ: ВЫВОД 1.08 rr
float hashpos = 1.08;
if (hashpos > 0 && hashpos < 10) {

    sprintf(juststringval, "%s  %7s", space, stringval);
    Serial.println(juststringval);
}
}

void setup()
{
char stringval[33] = "1.08";
char juststringval[33];
char space[] = " ";     ////ЭТО НЕ РАБОТАЕТ. ВЫВОД 1.08 ЛЕВЫЙ ОБОСНОВАН
float hashpos = 1.08;
if (hashpos > 0 && hashpos < 10) {

    sprintf(juststringval, "%s  %7s", space, stringval);
    Serial.println(juststringval);
}
}

Но я не могу жить с другими символами в своей строке.
Я могу что-то сделать?

, 👍1

Обсуждение

Правильное обоснование используется по умолчанию. Вы пытались напечатать другую строку над или под ней для сравнения?, @Ignacio Vazquez-Abrams

Да и по умолчанию левая выравнивание. Когда вы печатаете что-то на новой строке, оно начинается слева, как слова на странице., @LegitimateWorkUser

Будет ли это работать, если вы предоставите строку с левым дополнением?, @Ignacio Vazquez-Abrams

Нет, это всегда как можно дальше влево. Как в моем последовательном порту, так и на моем сенсорном экране. Даже если я искусственно вставлю пробелы в "stringval", @LegitimateWorkUser

Печать обычно начинается слева, но в пределах поля, описанного спецификацией формата - %5s в вашем случае строка будет выровнена по правому краю в этом 5-символьном поле (при условии, что строка состоит из 5 символов или меньше). Насколько широкий у вас экран? Если вы пытаетесь выполнить выравнивание по правому краю до ширины 20-символьного экрана, f/ex, вам понадобится (20+1) символьный буфер и выполните:sprintf(buffer, "%20s", stringval ); Serial.print(buffer); Это напечатает строку из 20 символов, дополненную пробелом слева, заканчивающуюся вашим «stringval»., @JRobert

Мой текст начинается с определенной координаты пикселя на экране. Всякий раз, когда в моем выводе отсутствует знак минус, мне нужно дополнительное пространство. Но я говорю, что этот метод не работает. Как в моем последовательном порту, так и на моем сенсорном экране вывод всегда максимально левый. И, к сожалению, мне не сойдет с рук изменение начальной координаты., @LegitimateWorkUser

Функции xxprintf() не знают об алгебраических знаках (или любых других числовых функциях) в строках. Для этого вам нужно будет выполнить преобразование в строку из некоторого числового формата, который соблюдает соглашение (минус или пробел) для печати знаков. Что касается правильного выравнивания, я только что запустил ваш код, настроил ширину поля и распечатал его в окне терминала Arduino IDE. Вывод действительно сместился дальше вправо с большей шириной поля..., @JRobert

... Тем не менее, я сначала протестировал его в Eclipse, чей терминал использует шрифт переменной ширины, а пробелы были достаточно малы, чтобы не иметь большого значения. С терминалом Arduino IDE и шрифтом фиксированной ширины это было гораздо более очевидно., @JRobert

@JRobert- В настоящее время я использую Visual Micro для Visual Studio. И моя проблема не в обнаружении знака минус. Это не связано. Но мне интересно, если это просто причуда моего последовательного монитора., @LegitimateWorkUser

Это БЫЛО причудой моего серийного монитора., @LegitimateWorkUser

Я только что попробовал, и, к моему удивлению, строка формата «% 5s» фактически печатает начальные пробелы, если строка короче 5 символов., @Bigoldsofty


1 ответ


2

Ошибка, о которой идет речь и в комментариях (кроме комментария Bigoldsofty), заключается в отсутствии символа для оправдания. Этот символ должен быть в строке формата перед требуемой шириной. "% 5s" не "%5s"

,