Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.1. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π²Π²ΠΎΠ΄Π° с Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра Π½Π° Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΈΠ»ΠΈ с Π½ΠΈΠΆΠ½Π΅Π³ΠΎ Π½Π° Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ Π² зависимости ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½Π° вызываСтся ΠΈ тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ находится Π² arg[0].

7.2 Π€ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ (printf)

Ѐункция printf ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ значСния Π² тСкст.

int printf(char *format, arg1, arg2, …)

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… ΠΌΡ‹ использовали printf Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ случаи примСнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ΠΏΠΎΠ»Π½ΠΎΠ΅ Π΅Π΅ описаниС Π΄Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ B.

Ѐункция printf ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² стандартном Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ½Π° количСство Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π½Ρ‹Ρ… символов.

Ѐорматная строка содСрТит Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ спСцификации прСобразования, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° printf. Π›ΡŽΠ±Π°Ρ спСцификация прСобразования начинаСтся Π·Π½Π°ΠΊΠΎΠΌ % ΠΈ заканчиваСтся символом-спСцификатором. ΠœΠ΅ΠΆΠ΄Ρƒ % ΠΈ символом-спСцификатором ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ располоТСны (Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ порядкС) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

β€’ Π—Π½Π°ΠΊ минус, ΠΏΡ€Π΅Π΄ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ Π»Π΅Π²ΠΎΠΌΡƒ ΠΊΡ€Π°ΡŽ поля.

β€’ Число, ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ поля. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈ нСобходимости лишниС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ слСва (ΠΈΠ»ΠΈ справа ΠΏΡ€ΠΈ лСвостороннСм располоТСнии) Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ.

β€’ Π’ΠΎΡ‡ΠΊΠ°, ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ ΡˆΠΈΡ€ΠΈΠ½Ρƒ поля ΠΎΡ‚ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ.

β€’ Число (Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ), ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ максимальноС количСство ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌΡ‹Ρ… символов Π² строкС, ΠΈΠ»ΠΈ количСство Ρ†ΠΈΡ„Ρ€ послС дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΈ - для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, ΠΈΠ»ΠΈ минимальноС количСство Ρ†ΠΈΡ„Ρ€ - для Ρ†Π΅Π»ΠΎΠ³ΠΎ.

β€’ Π‘ΡƒΠΊΠ²Π° h, Ссли ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ short, ΠΈΠ»ΠΈ l (латинская Π±ΡƒΠΊΠ²Π° ell), Ссли Ρ†Π΅Π»ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ long.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹-спСцификаторы пСрСчислСны Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 7.1. Если Π·Π° % Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ символ- спСцификатор, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. Π¨ΠΈΡ€ΠΈΠ½Ρƒ ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ *; Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ (ΠΈΠ»ΠΈ точности) Π² этом случаС бСрСтся ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° int). НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ max символов ΠΈΠ· строки s, годится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ запись:

printf("%.*s", max, s);

Π’Π°Π±Π»ΠΈΡ†Π° 7.1 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ прСобразования printf

Π‘ΠΈΠΌΠ²ΠΎΠ» Π’ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°; Π²ΠΈΠ΄ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ d, i int; дСсятичноС Ρ†Π΅Π»ΠΎΠ΅ o unsigned int; Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ (octal) Ρ†Π΅Π»ΠΎΠ΅ (Π±Π΅Π· нуля слСва) x, X unsigned int; Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ (Π±Π΅Π· 0x ΠΈΠ»ΠΈ 0X слСва), для 10…15 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ abcdef ΠΈΠ»ΠΈ ABCDEF u unsigned int; Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ дСсятичноС Ρ†Π΅Π»ΠΎΠ΅ c int; ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ символ s char *; ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ символы, располоТСнныС Π΄ΠΎ Π·Π½Π°ΠΊΠ° \0, ΠΈΠ»ΠΈ Π² количСствС, Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ f double; [-]m.dddddd, Π³Π΄Π΅ количСство Ρ†ΠΈΡ„Ρ€ d задаСтся Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ 6) e, E double; [-]m.dddddde+xx ΠΈΠ»ΠΈ [-]m.ddddddE+xx, Π³Π΄Π΅ количСство Ρ†ΠΈΡ„Ρ€ d задаСтся Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ 6) g, G double; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ %e ΠΈΠ»ΠΈ %E, Ссли порядок мСньшС, Ρ‡Π΅ΠΌ -4, ΠΈΠ»ΠΈ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π΅Π½ точности; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ %f. Π—Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Π½ΡƒΠ»ΠΈ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π°Ρ дСсятичная Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ p void *; ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (прСдставлСниС зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ) % АргумСнт Π½Π΅ прСобразуСтся; пСчатаСтся Π·Π½Π°ΠΊ %

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π±Ρ‹Π»Π° продСмонстрирована Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ…. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ составляСт Π·Π°Π΄Π°Π½ΠΈΠ΅ точности для строк. Π”Π°Π»Π΅Π΅ приводится ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ спСцификаций ΠΈ показываСтся ΠΈΡ… влияниС Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ строки "hello, world", состоящСй ΠΈΠ· 12 символов. ПолС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°ΠΌΠ»Π΅Π½ΠΎ двоСточиями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° Π²ΠΈΠ΄Π½Π° Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‚ΡΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ.

:%s:        :hello, world:

:%10s       :hello, world:

:%.10s:     :hello, wor:

:%-10s:     :hello, world:

:%.15s:     :hello, world:

:%-15s:     :hello, world     :

:%15.10s:   :       hello, wor:

:%-15.10s:  :hello, wor       :

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅: функция printf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, сколько Π΅Ρ‰Π΅ оТидаСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΈΠΏΠ°. Π’Ρ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… обращСниях:

printf(s); /* ΠΠ•Π’Π•Π ΠΠž, Ссли Π² s Π΅ΡΡ‚ΡŒ % */

printf("%s", s); /* Π’Π•Π ΠΠž всСгда */

Ѐункция sprintf выполняСт Ρ‚Π΅ ΠΆΠ΅ прСобразования, Ρ‡Ρ‚ΠΎ ΠΈ printf, Π½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π² строкС

int sprintf(char *string, char *format, arg1, arg2,…)

Π­Ρ‚Π° функция Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ arg1, arg2 ΠΈ Ρ‚. Π΄. Π² соотвСтствии с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ format, ΠΊΠ°ΠΊ ΠΌΡ‹ описывали Ρ€Π°Π½Π΅Π΅, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π΅ Π² стандартный Π²Ρ‹Π²ΠΎΠ΄, Π° Π² string. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ строка string Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ достаточно большой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΉ помСстился Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.2. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ способом любой Π²Π²ΠΎΠ΄. Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ нСграфичСскиС символы Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ ΠΈΠ»ΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ (Π² Ρ„ΠΎΡ€ΠΌΠ΅, принятой Π½Π° вашСй машинС), обрывая Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ тСкстовыС строки.

7.3 Бписки Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ содСрТит Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ минимальной вСрсии printf. ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡΡ ΠΎΠ½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ со списками Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π±Ρ‹ пСрСносимы. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нас Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ интСрСсуСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ minprintf напишСм Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π² основном Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π·Π°Π΄Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ строкой ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ; Ρ‡Ρ‚ΠΎ ΠΆΠ΅ касаСтся Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартного printf.

ОбъявлСниС стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf выглядит Ρ‚Π°ΠΊ:

int printf(char *fmt, …)

ΠœΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ Π² объявлСнии ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ число ΠΈ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π—Π½Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Наша функция minprintf ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ

void minprintf(char *fmt, …)

ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ число символов, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π΅Ρ‚ printf.

Вся ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ minprintf Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ вдоль списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², - вСдь Ρƒ этого списка Π½Π΅Ρ‚ Π΄Π°ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» β€Ήstdarg.hβ€Ί содСрТит Π½Π°Π±ΠΎΡ€ ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΡˆΠ°Π³Π°Ρ‚ΡŒ ΠΏΠΎ списку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². НаполнСниС этого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΊ машинС, Π½ΠΎ прСдставлСнный ΠΈΠΌ интСрфСйс Π²Π΅Π·Π΄Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ².

Π’ΠΈΠΏ va_list слуТит для описания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²; Π² minprintf эта пСрСмСнная ΠΈΠΌΠ΅Π΅Ρ‚ имя ap (ΠΎΡ‚ "argument pointer" - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚). ΠœΠ°ΠΊΡ€ΠΎΡ va_start ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ap) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»Π° Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ бСзымянный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. К va_start Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ использования ap. Π‘Ρ€Π΅Π΄ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ: ΠΎΡ‚ послСднСго ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° этот макрос "отталкиваСтся" ΠΏΡ€ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ установкС.

ΠœΠ°ΠΊΡ€ΠΎΡ va_arg Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ своСм Π²Ρ‹Π·ΠΎΠ²Π΅ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π° ap ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Π΅Ρ‚ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ: Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° ΠΎΠ½ опрСдСляСт Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ шага для Π²Ρ‹Ρ…ΠΎΠ΄Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. НаконСц, макрос va_end Π΄Π΅Π»Π°Π΅Ρ‚ очистку всСго, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. К va_end слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄ самым Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ срСдства ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ основу нашСй ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ вСрсии prinf.

#include β€Ήstdarg.hβ€Ί


/* minprintf: ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ printf с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² */