Директория C

Форматиращият низ се състои от два типа елементи. Елементите от първия тип са символи, които се показват на екрана. Елементите от втория тип съдържат команди за форматиране, които определят как се показват аргументите. Командата за форматиране започва със знак за процент, последван от код за форматиране. Броят на аргументите трябва точно да съвпада с броя на командите за форматиране, като съвпадението е задължително и в реда, в който се появяват. Например следната функция printf() ще покаже на екрана „Здравей от 10!“

Ако има по-малко дадени аргументи от командите за форматиране, резултатът ще бъде недефиниран. Ако има повече аргументи от командите за форматиране, останалите „несъвпадащи“ аргументи се отхвърлят. Командите за форматиране са изброени по-долу.

Функцията printf() връща броя на действително отпечатаните знаци. Отрицателна върната стойност показва грешка.

Командите за форматиране могат да имат модификатори, които определят ширината на полето, прецизността и лявото подравняване. Стойността на цялото число между знака % и командата за формат действа като спецификатор за минималната ширина на полето. Наличието на този спецификатор ще накара резултата да бъде подплатен с интервали или нули, за да се гарантира, че изходната стойност има определената минимална дължина. Ако изходната стойност (низ или число) е по-голяма от този минимум, тя ще бъде изведена изцяло, въпреки надвишаването на минимума. Заместителят по подразбиране е интервал. За да добавите нули, поставете 0 преди спецификатора на ширината на полето. Например форматиращият низ %05d ще допълни показаното число с нули (ще има по-малко от 5), така че общата дължина да е 5 знака.

Точната стойност на модификатора на прецизностзависи от кода на формата, за който се прилага. За да добавите модификатор на точност, следвайте спецификатора на ширината на полето с десетична точка, последвана от стойността на спецификацията на точност. За форматите a, A, e, E, f и F модификаторът за точност определя броя на десетичните знаци за показване. Например форматиращият низ %10.4f ще изведе число с ширина най-малко десет знака с четири знака след десетичната запетая. Ако модификаторът на прецизност се приложи към код във формат g или G, тогава той определя максималния брой значими цифри за показване. Когато се прилага към цели числа, модификаторът за точност указва минималния брой цифри за показване. Ако е необходимо, ще бъдат добавени водещи нули.

Когато модификаторът за точност се прилага към низове, числото след точката определя максималната дължина на полето. Например форматиращият низ %5.7s ще покаже низ от поне пет, но не повече от седем знака. Ако изходният низ е по-дълъг от максималната дължина на полето, символите в края ще бъдат съкратени.

По подразбиране всички изходни стойности са подравнени вдясно: ако ширината на полето е по-голяма от изходната стойност, тя ще бъде подравнена вдясно с полето. За да зададете ляво подравняване, поставете знак минус непосредствено след знака %. Например форматиращият низ %-10.2f ще доведе до изравняване наляво на реално число (с два знака след десетичната запетая в поле от 10 знака).

Има два модификатора на команда за форматиране, които позволяват на функцията printf() да показва къси и дълги цели числа. Тези модификатори могат да бъдат приложени към спецификаторите на типа d, i, o, u, x и x. Модификаторът l уведомява формата на дългата стойност. Например низът %ld означава, че е изведено дълго цяло число. Модификаторът h показва кратък формат. следователнонизът %hu означава, че изходните данни са от тип кратко цяло число без знак.

Ако използвате модерен компилатор, който поддържа функцията за широк символ (двубайтов знак), добавен през 1995 г., можете да използвате модификатора l в спецификатора c, за да посочите използването на двубайтови знаци. Модификаторът l може също да се използва с командата s format за извеждане на низ от двубайтови знаци.

Модификаторът l може също да бъде поставен преди командите за форматиране на реални числа a, A, e, E, f, F, g и G. В този случай той ще уведоми изхода за дълга двойна стойност.

Командата n съхранява в целочислена променлива, към която сочи списъкът с аргументи, броя на знаците, които са били записани в изходния поток до момента, в който спецификаторът n бъде намерен. Например, следният програмен фрагмент ще отпечата числото 14 след низа "Това е тест".

За да се посочи, че съответният аргумент сочи към дълго цяло число, модификаторът l може да се приложи към спецификатора n. За да посочите кратко цяло число, приложете модификатора h към спецификатора n.

Символът # има специално значение, когато се използва с някои кодове за формат на функция printf(). Символът #, поставен преди кодовете a, A, g, G, f, e и E, гарантира наличието на десетична запетая, дори ако няма десетични цифри. Ако поставите знака # пред кодовете за формат x и x, тогава шестнадесетичното число ще бъде изведено с префикс 0x. Ако поставите # преди кодовете за формат o и 0, тогава осмичното число ще бъде отпечатано с префикс O. Символът # не може да се използва с други спецификатори на формат.

Спецификаторите за минималната ширина и прецизност на полето могат да бъдат зададени не чрез константи, а чрез аргументи на функцията printf(). За това вНизът за форматиране използва знака звездичка (*). При сканиране на форматирания низ за printf(), всеки знак * ще бъде съпоставен със съответния аргумент в реда, в който се появява.

Модификатори на формат, добавени към функцията printf() от стандарта C99

Версията C99 добави няколко модификатора на формат за използване във функцията printf(): hh, ll, j, z и t. Модификаторът hh може да се приложи към спецификаторите d, i, o, u, x, x и n. Това означава, че съответният аргумент е стойност от тип signed char или unsigned char, а в случай на спецификатора n, указател към променлива от тип signed char. Модификаторът ll може да се приложи и към спецификаторите d, i, o, u, x, x и n. Това означава, че съответният аргумент е стойност от тип signed long long int или unsigned long long int, или, в случай на спецификатора n, указател към променлива от тип long long int.

Модификаторът на формат j, който се прилага към спецификаторите d, i, o, u, x, x и n, означава, че съответният аргумент е от тип intmax_t или uintmax_t. Тези типове се декларират в заглавката и се използват за съхраняване на цели числа с най-голяма дължина.

Модификаторът на формат z, който се прилага към спецификаторите d, i, o, u, x, x и n, означава, че съответният аргумент е от тип size_t. Този тип е деклариран в заглавката и се използва за съхраняване на резултата от операцията sizeof.

Модификаторът на формат t, който се прилага към спецификаторите d, i, o, u, x, x и n, означава, че съответният аргумент е от тип ptrdiff_t. Този тип е деклариран в заглавката и се използва за съхраняване на стойността на разликата между два указателя.

C99 също позволява модификаторът l да бъде приложен към спецификаторите на реален тип a, A, e, E, f, F, g и G, но не работи.