Как сделать пробел в printf
Есть ли способ напечатать определенное количество пробельных символов?
Я не могу использовать мин. ширина пробела "\"%-5s\"" потому что это приведет к "str ". и мне нужно вывести "str" .
Я знаю, что могу сделать это тупым путем:
Но я бы оценил более эффективный обходной путь.
Решение
Где ведущий и тянущийся int.
Только для трейлинга
Подобные модификации могут быть сделаны только для ведущих
РЕДАКТИРОВАТЬ
Спецификатор ширины позволяет использовать звездочку для обеспечения переменной ширины.
В этом случае% * c сообщает printf, чтобы получить следующий аргумент и использовать его в качестве ширины символа.
Первоначально он читает ведущий и использует его для ширины поля, в котором печатается символ, пробел. Затем печатается кавычка, \ «. Формат% s печатает следующий аргумент, стр. Другая печатная кавычка и затем снова% * c читает конечный символ в качестве ширины поля, в котором нужно напечатать следующий аргумент, другой пробел.
Очень многие не знают о существовании в языке C стандартных функций форматированного ввода, и особенно вывода данных. Простейший вывод числа в строчку порой превращается в по-настоящему адовые функции с кромсанием числа на разряды (обычно неэффективно реализованным), выделением памяти под строку и прочими ночными кошмарами.
Но всё это реализовано уже очень давно. Страшно сказать, но функция printf празднует в следующем году 50-летний юбилей! Да этих функций и не могло не быть — на заре развития компьютеров и компиляторов единственным средством общения программы с человеком был текстовый ввод-вывод.
Эти функции лежат в библиотеке stdio, подключим её:
Итак, функция которая понадобится вам чаще всего — sprintf. Она принимает:
sprintf работает как шаблонизатор: она читает строку форматирования, находит в ней идентификаторы, подставляет на их место значения переданных параметров и выводит результат в *s.
В строке форматирования может быть несколько идентификаторов, тогда в качестве параметров должно быть передано такое же количество аргументов, и конечно они должны чётко соответствовать типу, указанному в идентификаторе.
Самые частые случаи
Чаще всего вам понадобятся:
Можно добавлять управляющие последовательности, например \n — перевод строки.
Описание
Ни один из элементов не является обязательным, кроме типа. Часть элементов относятся только к некоторым типам, например ширина, точность и размер — только к числовым типам.
Между элементами могут стоять пробелы, но делать так нельзя — резко увеличивается вероятность ошибки.
Числовые целые типы
%d/%i, %u, %o, %x/%X — всё это типы целых чисел int (т.е. оно имеет длину равную разрядности платформы).
%d и %i — десятичное целое знаковое число, минус ставится только у отрицательных чисел.
%u — десятичное целое беззнаковое число.
%o — восьмеричное представление int.
%x — шестнадцатиричное представление int в строчном формате: 0..9, a..f.
%X — шестнадцатиричное представление int в прописном формате: 0..9, A..F.
К ним можно применить модификаторы размера:
%l — число интерпретируется как long int = int16_t
%ll — long long int = int32_t
Флаги:
%-d — выравнивание числа по левому краю
И размерность:
%2d — длина числа минимум 2 символа. Если меньше — оно будет дополнено слева пробелами (либо нулями, если есть флаг 0)
Я очень часто использую идентификатор %02X для вывода шестнадцатиричных чисел в пакетах данных, например:
Типы с плавающей точкой
%e — экспоненциальная запись
Модификатор размера только один:
К ним можно применить те же самые флаги 0 и -, а также можно указать ширину и точность:
%.2f — выведет float с двумя знаками после запятой. Если они равны 0 — они всё равно будут выведены, поэтому так можно делать красиво выровненные таблички.
%10.2f — как и в прошлой главе, дополнит число нулями или пробелами до длины 10 символов.
Символы
%c выводит символ с кодом, переданным в качестве параметра.
Строки
%s выводит переданную строку, вплоть до её терминирующего нуля.
Особые типы
%n записывает в переданную переменную счётчик символов — количество символов, которое было выведено на момент появления этого идентификатора.
%p выводит адрес указателя.
Варианты функций printf
Мы уже рассмотрели функцию sprintf, как наиболее полезную при программировании под МК — она выводит текст в переданный указатель на строку. Но это не единственная функция из семейства:
- printf(char *format, …) — выводит текст в стандартный вывод (STDIO). Больше применима при программировании для компьютера, но в принципе вы можете переопределить встроенную функцию putc, чтобы она выводила символ как-то по-другому — и сможете, например, выводить через printf напрямую на ЖК-экран.
- snprintf(char *s, int n, char *format, …) — ограничивает количество выведенных символов параметром n, непоместившиеся символы будут потеряны. Очень полезно, если у вас есть какой-то накопительный буфер, который нельзя переполнять.
- fprintf(FILE *f, char *format, …) — выводит текст в файл. Опять же, в основном используется на ПК, но опять же вы можете переопределить её и, например, выводить данные в SD-карту.
- vprintf(char *format, va_list va) — использует перечень аргументов variable arguments. Это просто незаменимая фича при написании своей обёртки вокруг printf.
Все функции вида printf возвращают количество записанных символов.
scanf
Функция, обратная sprintf — это sscanf. Она принимает строку с данными и текстом, пытается её разобрать в соответствии со строкой форматирования, и записывает найденные данные по переданным адресам. Простейший пример:
Здесь действуют все те же самые правила составления идентификаторов, что и в printf, и есть все те же самые функции вроде scanf, fscanf, sscanf.
В этом уроке мы продемонстрируем различные примеры форматирования с помощью метода printf () |/.
Метод является частью класса java.io.PrintStream и обеспечивает строгое форматирование, аналогичное функции printf() в C.
Дальнейшее чтение:
Руководство по java.util.Форматирующее устройство
Руководство по DateTimeFormatter
Заполните строку нулями или пробелами в Java
2. Синтаксис
Мы можем использовать один из этих методов PrintStream для форматирования выходных данных:
Мы задаем правила форматирования с помощью параметра формат . Правила начинаются с символа % .
Давайте рассмотрим краткий пример, прежде чем мы углубимся в детали различных правил форматирования:
Это приводит к следующему результату:
Как показано выше, строка формата содержит обычный текст и два правила форматирования. Первое правило используется для форматирования строкового аргумента. Второе правило добавляет символ новой строки в конец строки.
2.1. Правила Форматирования
Давайте рассмотрим строку формата более внимательно. Он состоит из литералов и спецификаторов формата. Спецификаторы формата включают флаги, ширину, точность и символы преобразования в этой последовательности:
Спецификаторы в скобках являются необязательными.
Внутренне printf() использует java.util.Форматер класс для анализа строки формата и создания выходных данных. Дополнительные параметры строки формата можно найти в файле Форматирования Javadoc .
2.2. Символы Преобразования
То преобразование-символ требуется и определяет, как форматируется аргумент.
Символы преобразования допустимы только для определенных типов данных. Вот некоторые из наиболее распространенных:
- s форматирует строки.
- d форматирует десятичные целые числа.
- f форматирует числа с плавающей запятой.
- t форматирует значения даты/времени.
Мы рассмотрим их и несколько других позже в этом уроке.
2.3. Дополнительные Модификаторы
[Флаги] определяют стандартные способы изменения выходных данных и наиболее распространены для форматирования целых чисел и чисел с плавающей запятой.
[Ширина] задает ширину поля для вывода аргумента. Он представляет минимальное количество символов, записанных в вывод.
[.точность] указывает количество цифр точности при выводе значений с плавающей запятой. Кроме того, мы можем использовать его для определения длины подстроки для извлечения из Строки .
3. Разделитель Строк
Чтобы разбить строку на отдельные строки, у нас есть спецификатор % new :
Приведенный выше фрагмент кода приведет к следующему результату:
То %n разделитель printf() автоматически вставит собственный разделитель строк хост-системы.
4. Логическое Форматирование
Для форматирования логических значений мы используем формат %b . Это работает следующим образом: если входное значение true , то выходное значение true . В противном случае вывод будет false .
Итак, если мы сделаем следующее:
тогда мы посмотрим:
Обратите внимание, что мы можем использовать %B для форматирования в верхнем регистре.
5. Форматирование Строк
Чтобы отформатировать простую строку, мы будем использовать комбинацию %s . Кроме того, мы можем сделать строку в верхнем регистре:
И это результат:
Кроме того, чтобы указать минимальную длину, мы можем указать ширину :
Если нам нужно оправдать нашу строку слева, мы можем использовать – флаг :
Это и есть результат:
Более того, мы можем ограничить количество символов в наших выходных данных, указав точность :
Первое x число в %x.y s синтаксис-это заполнение. y – это количество символов.
Для нашего примера здесь выводится Привет .
6. Форматирование Символов
Результатом %c является символ Юникода:
Заглавная буква C будет прописной в результате:
Но если мы дадим ему недопустимый аргумент, то Форматер выдаст Исключение IllegalFormatConversionException .
7. Форматирование Чисел
7.1. Целочисленное Форматирование
Метод printf() принимает все целые числа, доступные в языке — байт , короткий , int , длинный и BigInteger , если мы используем %d :
С помощью символа d мы получим такой результат:
В случае, если нам нужно отформатировать наш номер с разделителем тысяч, мы можем использовать флаг , |//. И мы также можем отформатировать наши результаты для разных регионов:
Как мы видим, форматирование в США отличается от форматирования в Италии:
7.2. Плавающее и двойное форматирование
Чтобы отформатировать число с плавающей точкой, нам понадобится формат f :
Конечно, первое, что приходит на ум, – это контролировать точность :
Здесь мы определяем ширину нашего числа как 5 , а длина десятичной части равна 2:
Здесь у нас есть отступ в один пробел от начала числа для поддержки заданной ширины.
Чтобы получить наш вывод в научной нотации, мы просто используем символ преобразования e :
И это наш результат:
8. Форматирование даты и времени
Для форматирования даты и времени строка преобразования представляет собой последовательность из двух символов: t или T символ и суффикс преобразования.
Давайте рассмотрим наиболее распространенные символы суффиксов форматирования времени и даты с примерами.
Определенно, для более продвинутого форматирования мы можем использовать DateTimeFormatter, который доступен с Java 8.
8.1. Форматирование Времени
Во-первых, давайте посмотрим список некоторых полезных символов суффикса для форматирования времени:
- Символы H,M,Sотвечают за извлечение часов, минут и секунд из ввода Даты .
- L , N представляют время в миллисекундах и наносекундах соответственно.
- pдобавляет форматирование утра/вечера.
- zвыводит смещение часового пояса.
Теперь предположим, что мы хотим распечатать временную часть Даты :
Приведенный выше код вместе с комбинацией %tT выдает следующий результат:
В случае, если нам потребуется более подробное форматирование, мы можем запросить различные временные сегменты:
Используя H , M и S , мы получаем этот результат:
Однако перечисление даты несколько раз-это боль.
В качестве альтернативы, чтобы избавиться от нескольких аргументов, мы можем использовать ссылку на индекс нашего входного параметра, которая в нашем случае равна 1$ :
Здесь мы хотим в качестве выходных данных текущее время, утра/вечера, время в миллисекундах и наносекундах, а также смещение часового пояса:
8.2. Форматирование Даты
Как и форматирование времени, у нас есть специальные символы форматирования для форматирования даты:
- Aраспечатывает полный день недели.
- d форматирует двузначный день месяца.
- Bэто для полного названия месяца.
- m форматирует двузначный месяц.
- Yвыводит год в четырехзначном виде.
- y выводит две последние цифры года.
Предположим, мы хотим показать день недели, за которым следует месяц:
Затем, используя A , B и Y , мы получим этот вывод:
Чтобы все наши результаты были в числовом формате, мы можем заменить A , B , Y буквы на d , m , y :
9. Заключение
Наконец, как всегда, код, использованный во время обсуждения, можно найти на GitHub .
ВведениеСтандартная библиотека C/C++ включает ряд функций для чтения и записи на консоли (клавиатура и монитор). Эти функции читают и пишут данные как простой поток символов.
Функция стандартного вывода printf()
Функция printf() является функцией стандартного вывода. С помощью этой функции можно вывести на экран монитора строку символов, число, значение переменной…
Функция printf() имеет прототип в файле stdio.h
int printf(char *управляющая строка, …);
В случае успеха функция printf() возвращает число выведенных символов.
Управляющая строка содержит два типа информации: символы, которые непосредственно выводятся на экран, и спецификаторы формата, определяющие, как выводить аргументы.
Функция printf() это функция форматированного вывода. Это означает, что в параметрах функции необходимо указать формат данных, которые будут выводиться. Формат данных указывается спецификаторами формата. Спецификатор формата начинается с символа % за которым следует код формата.
Спецификаторы формата:
%с | символ |
%d | целое десятичное число |
%i | целое десятичное число |
%e | десятичное число в виде x.xx e+xx |
%E | десятичное число в виде x.xx E+xx |
%f | десятичное число с плавающей запятой xx.xxxx |
%F | десятичное число с плавающей запятой xx.xxxx |
%g | %f или %e, что короче |
%G | %F или %E, что короче |
%o | восьмеричное число |
%s | строка символов |
%u | беззнаковое десятичное число |
%x | шестнадцатеричное число |
%X | шестнадцатеричное число |
%% | символ % |
%p | указатель |
%n | указатель |
Кроме того, к командам формата могут быть применены модификаторы l и h.
%ld | печать long int |
%hu | печать short unsigned |
%Lf | печать long double |
В спецификаторе формата, после символа % может быть указана точность (число цифр после запятой). Точность задаётся следующим образом: %.n . Где n — число цифр после запятой, а — один из кодов приведённых выше.
Например, если у нас есть переменная x=10.3563 типа float и мы хотим вывести её значение с точностью до 3-х цифр после запятой, то мы должны написать:
Результат:
Переменная x = 10.356
Вы также можете указать минимальную ширину поля отводимого для печати. Если строка или число больше указанной ширины поля, то строка или число печатается полностью.
Например, если вы напишите:
то результат будет следующим:
20
Обратите внимание на то, что число 20 напечаталось не с самого начала строки. Если вы хотите чтобы неиспользованные места поля заполнялись нулями, то нужно поставить перед шириной поля символ 0.
Кроме спецификаторов формата данных в управляющей строке могут находиться управляющие символы:
Чаще всего вы будете использовать символ \n. С помощью этого управляющего символа вы сможете переходить на новую строку. Посмотрите примеры программ и вы всё поймёте.
Примеры программ.
Результат работы программы:
a=5, b=6, c=9
void main(void)
float x,y,z;
Результат работы программы:
Координаты объекта: x:10.50, y:130.67, z:54.00
Результат работы программы:
x=10
void main(void)
int a;
Результат работы программы:
a-dec=11, a-hex=b
void main(void)
char ch1,ch2,ch3;
Результат работы программы:
ABC
Результат работы программы:
Это Моя строка.
Результат работы программы:
Здравствуйте!
Меня зовут Павел.
Функция стандартного ввода scanf()
Функция scanf() — функция форматированного ввода. С её помощью вы можете вводить данные со стандартного устройства ввода (клавиатуры). Вводимыми данными могут быть целые числа, числа с плавающей запятой, символы, строки и указатели.
Функция scanf() имеет следующий прототип в файле stdio.h:
int scanf(char *управляющая строка);
Функция возвращает число переменных которым было присвоено значение.
Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %.
Спецификаторы формата:
%c | чтение символа |
%d | чтение десятичного целого |
%i | чтение десятичного целого |
%e | чтение числа типа float (плавающая запятая) |
%h | чтение short int |
%o | чтение восьмеричного числа |
%s | чтение строки |
%x | чтение шестнадцатеричного числа |
%p | чтение указателя |
%n | чтение указателя в увеличенном формате |
char *gets( char *buf );
С помощью функции gets() вы сможете вводить полноценные строки. Функция gets() читает символы с клавиатуры до появления символа новой строки (\n). Сам символ новой строки появляется, когда вы нажимаете клавишу enter. Функция возвращает указатель на buf. buf — буфер (память) для вводимой строки.
Хотя gets() не входит в тему этой статьи, но всё же давайте напишем пример программы, которая позволяет ввести целую строку с клавиатуры и вывести её на экран.
void main(void)
char buffer[100]; // массив (буфер) для вводимой строки
Ещё одно важное замечание! Для ввода данных с помощью функции scanf(), ей в качестве параметров нужно передавать адреса переменных, а не сами переменные. Чтобы получить адрес переменной, нужно поставить перед именем переменной знак &(амперсанд). Знак & означает взятие адреса.
Что значит адрес? Попробую объяснить. В программе у нас есть переменная. Переменная хранит своё значение в памяти компьютера. Так вот адрес, который мы получаем с помощью & это адрес в памяти компьютера где храниться значение переменной.
Давайте рассмотрим пример программы, который показывает нам как использовать &
void main(void)
int x;
Теперь давайте вернёмся к управляющей строке функции scanf(). Ещё раз:
int scanf(char *управляющая строка);
Символ пробела в управляющей строке дает команду пропустить один или более пробелов в потоке ввода. Кроме пробела может восприниматься символ табуляции или новой строки. Ненулевой символ указывает на чтение и отбрасывание этого символа.
Разделителями между двумя вводимыми числами являются символы пробела, табуляции или новой строки. Знак * после % и перед кодом формата (спецификатором формата) дает команду прочитать данные указанного типа, но не присваивать это значение.
при вводе 50+20 присвоит переменной i значение 50, переменной j — значение 20, а символ + будет прочитан и проигнорирован.
В команде формата может быть указана наибольшая ширина поля, которая подлежит считыванию.
указывает необходимость прочитать из потока ввода первые 5 символов. При вводе 1234567890ABC массив str будет содержать только 12345, остальные символы будут проигнорированы. Разделители: пробел, символ табуляции и символ новой строки — при вводе символа воспринимаются, как и все другие символы.
Если в управляющей строке встречаются какие-либо другие символы, то они предназначаются для того, чтобы определить и пропустить соответствующий символ. Поток символов 10plus20 оператором
присвоит переменной x значение 10, переменной y — значение 20, а символы plus пропустит, так как они встретились в управляющей строке.
Одной из мощных особенностей функции scanf() является возможность задания множества поиска (scanset). Множество поиска определяет набор символов, с которыми будут сравниваться читаемые функцией scanf() символы. Функция scanf() читает символы до тех пор, пока они встречаются в множестве поиска. Как только символ, который введен, не встретился в множестве поиска, функция scanf() переходит к следующему спецификатору формата. Множество поиска определяется списком символов, заключённых в квадратные скобки. Перед открывающей скобкой ставиться знак %. Давайте рассмотрим это на примере.
На экране программа выдаст:
12345
abcdefg456
Можно также определить символы, которые не входят в множество поиска. Перед первым из этих символов ставиться знак ^. Множество символов различает строчные и прописные буквы.
Напомню, что при использовании функции scanf(), ей в качестве параметров нужно передавать адреса переменных. Выше был написан код:
Обратите внимание на то, что перед str не стоит символ &. Это сделано потому, что str является массивом, а имя массива — str является указателем на первый элемент массива. Поэтому знак & не ставиться. Мы уже передаем функции scanf() адрес. Ну проще говоря str это адрес в памяти компьютера где будет храниться значение первого элемента массива.
Читайте также: