Sscanf си что это
Перейти к содержимому

Sscanf си что это

  • автор:

int sscanf(char *buf, const char *format, arg-list)

Функция sscanf() идентична функции scanf() во всем, кроме того, что данные считываются из массива, указанного аргументом buf, а не из файла stdin.

Возвращаемая величина равна количеству полей, значения которых действительно были при­своены переменным. В это количество не входят поля, пропущенные из-за использования моди­фикатора команды *. Возвращение 0 означает, что значение ни одного из полей не было присво­ено переменным, a EOF указывает на попытку чтения в конце строки.

Следующая программа выводит на экран сообщение «hello 1 » :
#include
int main ( void )
{
char str [ 80 ] ;
int i ;
sscanf ( «hello 1 2 3 4 5» , «%s%d» , str , & i ) ;
printf ( «%s %d» , str , i ) ;
return 0 ;
}

Sscanf си что это

#include
int scanf(const char *format, . );
int fscanf(FILE *stream, const char *format, . );
int sscanf(const char *str, const char *format, . );
#include
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap); Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)): vscanf(), vsscanf(), vfscanf(): _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
или cc -std=c99

ОПИСАНИЕ

  • Последовательность пробельных символов (пробел, табуляция, символ новой строки и т. д.; смотрите isspace(3)). Эта инструкция совпадает с любым количеством пустого места, включая отсутствие данных.
  • Обычный символ (т. е., отличный от пробельного или «%»). Такой символ должен точно совпадать со следующим символом входных данных.
  • Определитель преобразования, который начинается с символа «%» (процент). Последовательность символов ввода преобразуется в соответствии с определителем, а результат помещается в соответствующий параметр указатель. Если следующий элемент ввода не соответствует определителю преобразования, то преобразование завершается с ошибкой — ошибкой совпадения.

Каждый определитель преобразования в format начинается с символа «%» или последовательности символов «%n$» (смотрите о разнице далее) за которым следует:

  • Необязательный символ подавления назначения «*»: scanf() читает данные как предписано определителем преобразования, но отбрасывает их. Соответствующий параметр указатель необязателен, и этот определитель не учитывается в счётчике успешных назначений, возвращаемом scanf().
  • Необязательный символ «m». Используется в строковых преобразованиях (%s, %c, %[) и освобождает вызывающего от необходимости выделять соответствующий буфер для хранения входных данных: вместо этого scanf() выделяет буфер достаточного размера и присваивает адрес этого буфера соответствующему параметру указателю, который должен быть указателем на переменную char * (эту переменную не нужно инициализировать перед вызовом). Вызывающий должен вызвать free(3) для этого буфера, как только он станет ненужным.
  • Необязательное целое десятичное число, которое задаёт максимальную ширину поля. Чтение символов прерывается по достижении этого максимума или при нахождении несовпадающего символа, неважно что случится раньше. В большинстве преобразований начальные пробельные символы отбрасываются (исключения приведены далее), и эти отброшенные символы не учитываются в максимальной ширине поля. В преобразованных строках ввода сохраняется конечный байт null (‘\0’) для отметки конца ввода; в максимальной ширине поля он также не учитывается.
  • Необязательный символ модификатора типа. Например, модификатор типа l используется в преобразованиях целых чисел, например с помощью %d, для указания того, что соответствующий параметр указатель ссылается на long int, а не на int.
  • Определитель преобразования, который задаёт тип входного преобразования.

Определители преобразования в format бывают двух видов: начинающиеся с «%» и начинающиеся с «%n$». Эти два вида не должны использоваться одновременно в строке format, за исключением случая, когда строка, содержащая определители «%n$», может включать %% и %*. Если в format содержатся определители «%», то они задаются в порядке появления параметров указателей, указанных после. В форме «%n$» (есть в POSIX.1-2001, но отсутствует в C99), n — это десятичное целое, которое задаёт в какое место должен быть помещён ввод, то есть указывает на расположение n-го параметра указателя, передаваемого после format.

Преобразования

Следующие символы модификаторов типа (type modifier characters) могут появляться в определении преобразования: h Обозначает, что преобразование будет одним из d, i, o, u, x, X или n и следующий указатель является указателем на short int или на unsigned short int (но не int). hh Как h, но следующий указатель — указатель на signed char или unsigned char. j Как h, но следующий указатель — указатель на intmax_t или uintmax_t. Этот модификатор появился в C99. l Обозначает, что преобразование будет одним из d, i, o, u, x, X или n и следующий указатель является указателем на long int или unsigned long int (но не int), или что преобразование будет одним из e, f или g и следующий указатель является указателем на double (но не float). Указание двух символов l эквивалентно L. Если используется с %c или %s, то соответствующий параметр считается указателем на широкий символ или строку широких символов, соответственно. L Обозначает, что преобразование будет одним из e, f или g и следующий указатель является указателем на long double или преобразование будет одним из d, i, o, u или x и следующий указатель является указателем на long long. q Эквивалентен L. Данный определитель отсутствует в ANSI C. t Как h, но следующий указатель — указатель на ptrdiff_t. Этот модификатор появился в C99. z Как h, но следующий указатель — указатель на size_t. Этот модификатор появился в C99.

Доступны следующие определители преобразования:

% Совпадает с литерой «%». То есть %% в строке формата соответствует одиночному символу данных «%». Преобразование не выполняется (но начальные пробельные символы отбрасываются) и назначения не происходит. d Совпадает с необязательным знаковым десятичным целым; следующий указатель должен быть указателем на int. D Эквивалентно ld; оставлено только для обратной совместимости (замечание: есть только в libc4. В libc5 и glibc %D просто игнорируется, что приводит к непонятным ошибкам в старых программах). i Совпадает с необязательным знаковым целым; следующий указатель должен быть указателем на int. Целое считывается как шестнадцатеричное число, если начинается с 0x или 0X, как восьмеричное, если начинается с 0 и как десятичное в остальных случаях. Используются только символы, подходящие для работы с выбранным основанием системы счисления. o Совпадает с необязательным беззнаковым восьмеричным целым; следующий указатель должен быть указателем на unsigned int. u Совпадает с необязательным беззнаковым десятичным целым; следующий указатель должен быть указателем на unsigned int. x Совпадает с необязательным беззнаковым шестнадцатеричным целым; следующий указатель должен быть указателем на unsigned int. X Эквивалентно x. f Совпадает с необязательным знаковым числом с плавающей запятой; следующий указатель должен быть указателем на float. e Эквивалентно f. g Эквивалентно f. E Эквивалентно f. a (C99) Эквивалентно f. s Совпадает с последовательностью непробельных символов; следующий указатель должен указывать на первый элемент массива символов достаточной длины для сохранения входной последовательности и завершающего байта null (‘\0’), который добавляется автоматически. Входная строка обрывается при появлении пробельного символа или достижении максимальной ширины поля, неважно что случится раньше. c Совпадает с последовательностью символов, чья длина задаётся максимальной шириной поля (по умолчанию 1); следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов (завершающий байт null не добавляется). Обычный пропуск начальных пробелов не выполняется. Чтобы пропустить пробелы, явно укажите их в формате. [ Совпадает с непустой последовательностью символов из задаваемого набора допустимых символов; следующий указатель должен быть указателем на char и должно быть достаточно места для всех символов в строке плюс завершающий байт null. Обычный пропуск начальных пробелов не выполняется. Строка будет состоять (или нет) из символов определённого набора; набор задаётся указанием символов между символом открывающей скобки [ и закрывающей скобки ]. Набором определяются исключающиеся символы, если первым символом после открывающей скобки является символ диакритического знака (^). Чтобы включить закрывающую скобку в набор, укажите её первым символом после открывающей скобки или диакритического знака; в любой другой позиции она закрывает набор. Символ переноса также является специализированным; если он указывается между двумя символами, то в набор добавляются все лежащие в промежутке символы. Чтобы добавить в набор символ переноса укажите его последним, перед конечной закрывающей скобкой. Например, [^]0-9-] означает, что «все символы, кроме закрывающей скобки, цифр от 0 до 9 и переноса». Строка обрывается при появлении символа не из набора (или, при указании символа диакритического знака, из) или при достижении ширины поля. p Совпадает со значением указателя (как выводится при %p в printf(3)); следующий указатель должен быть указателем на void. n Ничего не ожидается; вместо этого количество символов, использованных к настоящему времени из ввода, сохраняется по следующему указателю, который должен быть указателем на int. Это не преобразование и не увеличивает счётчик, возвращаемый функцией. Назначение может подавляться при указании символа подавления назначения *, но влияние этого на возвращаемое значение не определено. Поэтому преобразования %*n лучше не использовать.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

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

Если конец входных данных был достигнут раньше, чем произошло хотя бы одно совпадение или при ошибке совпадения возвращается значение EOF. Значение EOF также возвращается при ошибке чтения; в этом случае для потока устанавливается индикатор ошибки (смотрите ferror(3)), а в errno указывается номер ошибки.

ОШИБКИ

EAGAIN Файловый дескриптор stream помечен как неблокирующий, а чтение вызвало бы блокировку. EBADF Неправильный файловый дескриптор для stream или он не открыт на чтение. EILSEQ Из входной байтовой последовательности невозможно создать корректный символ. EINTR Операция чтения была прервана сигналом; смотрите signal(7). EINVAL Недостаточно параметров или format равен NULL. ENOMEM Не хватает памяти. ERANGE Результат преобразования целого превысил бы размер, который можно хранить в соответствующем целочисленном типе.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
scanf(), fscanf(),
sscanf(), vscanf(),
vsscanf(), vfscanf()
безвредность в нитях безвредно (MT-Safe locale)

СООТВЕТСТВИЕ СТАНДАРТАМ

Функции fscanf(), scanf() и sscanf() соответствуют C89, C99 и POSIX.1-2001. В этих стандартах не определена ошибка ERANGE.

Определитель q в 4.4BSD используется для long long, а определители ll или L используются в GNU для преобразования целых чисел.

Версия Linux этих функций основана на библиотеке GNU libio. Более точное описание функций можно найти в документации в формате info на GNU libc (glibc-1.08).

ЗАМЕЧАНИЯ

Модификатор выделения-назначения «a»

Первоначально, в библиотеке GNU C поддерживалось динамическое выделение памяти для входных строк при указании символа a (нестандартное расширение) (это свойство существует до glibc 2.0). То есть можно указать scanf() выделить буфер под входную строку, передав в указателе только указатель на буфер *buf:

Использование буквы a для этой цели проблематично, так как a также используется в стандарте ISO C как синоним f (ввод данных с плавающей запятой). В POSIX.1-2008 для назначения с выделением определён модификатор m (смотрите в ОПИСАНИЕ выше).

Заметим, что модификатор a недоступен, если программа скомпилирована посредством gcc -std=c99 или gcc -D_ISOC99_SOURCE (если не определён _GNU_SOURCE); в этом случае a рассматривается как определитель чисел с плавающей запятой (смотрите выше).

Поддержка модификатора m была добавлена в glibc начиная с версии 2.7, и в новых программах нужно использовать этот модификатор вместо a.

Стандартизированный в POSIX модификатор m имеет дополнительные преимущества над a:

* Он может также применяться к определителям преобразования %c (например, %3mc). * Исчезает неоднозначность с определителем преобразования чисел с плавающей запятой %a (не подвержен влиянию gcc -std=c99).

ДЕФЕКТЫ

Все функции полностью соответствуют C89, но предоставляют дополнительные определители q и a, а также дополнительные возможности определителей L и l. Последнее может считаться дефектом, так как это изменяет поведение определителей, заданное в C89.

Некоторые комбинации модификаторов типов и определителей преобразования, определённые в ANSI C, не имеют смысла (например, %Ld). Хотя они могут иметь хорошо описанное поведение в Linux, это не обязательно так на других архитектурах. Поэтому, обычно, лучше использовать модификаторы, не определённые в ANSI C, то есть использовать q вместо L в комбинации с преобразованием d, i, o, u, x и X или ll.

Работа q отличается от работы в 4.4BSD, так как может использоваться при преобразовании вещественных числе подобно L.

ПРИМЕР

Чтобы использовать определитель динамического выделения при преобразовании, укажите m в качестве модификатора длины (в виде %ms или %m[диапазон]). Вызывающий должен вызвать free(3) для возвращённой строки как в следующем примере:

char *p; int n; errno = 0; n = scanf(«%m[a-z]», &p); if (n == 1) < printf("чтение: %s\n", p); free(p); >else if (errno != 0) < perror("scanf"); >else

Как показано в примере выше, необходимо вызывать free(3) только, если при вызове scanf() была прочитана строка.

Sscanf си что это

Функция sscanf считывает данные из строки (массива символов) в переменные. Функция имеет следующий синтаксис

int sscanf (const char * buffer, const char * format, …);

Первый параметр функции представляет строку, из которой считываются данные. Второй параметр представляет формат считывания. В качестве последующих параметров указываются переменные, в которые идет считывание.

Считаем данные из строки

#include int main(void)

В данном случае строка, из которой считываются данные:

"F 69 123.45"

Разделителем между значениями является пробел, либо последовательность пробелов, табуляция и перевод строки.

Эту строку передаем в функцию sscanf первым аргументом и считываем ее значения в переменные c , n , d :

А второй аргумент — формат считывания определяет, как данные из строки будут сопоставляться с переменными:

"%c %d %lf"

Поскольку значения в строке buff разделены пробелами, то и в строки форматирования спецификаторы разделены пробелами. Первый спецификатор %c позволяет считать первый символ в переменную типа char c .

Второй спецификатор — %d обеспечивает считывание целого числа в переменную n .

И третий спецификатор %lf считывает данные в переменную типа double — d

То есть в итоге консольный вывод был бы следующим:

Values: F, 69, 123.450000

Обратите внимание, что формат считывания соответствует строке, из которой считываются данные. Если бы в строке данные были бы разделены запятыми, то спецификаторы в формате считывания также были бы разделены запятыми:

#include int main(void)

Еще один пример. Пусть в строке содержатся данные пользователя, как имя, возраст, зарплата. Считаем эти данные в переменные:

#include int main(void)

Причем строка форматирования может быть более сложной. Например:

#include int main(void) < char *buff = "Name is Tom and age is 38"; char name[10]; int age; sscanf(buff, "Name is %s and age is %d", name, &age); printf("Name: %s \tAge: %d\n", name, age); // Name: Tom Age: 38 return 0; >

В данном случае исходная строка представляет текст «Name is Tom and age is 38» . И на эту строку накладывается строка форматирования «Name is %s and age is %d» . Соответственно здесь спецификатор %s будет представлять строку «Tom», а спецификатор %d — число 38.

Считывание с консоли

Комбинируя это функцию с fgets() , можно считывать данные с консоли:

#include int main(void) < char buff[50]; char name[10]; int age; double salary; printf("Enter the data\n"); if(!fgets(buff, 50, stdin)) < printf("Fatal Error!\n"); return 1; >sscanf(buff, "%s %d %lf", name, &age, &salary); printf("Name: %s \tAge: %d \tSalary: %.2lf\n", name, age, salary); return 0; >

Пример консольного ввода:

Enter the data Tom 38 456.78 Name: Tom Age: 38 Salary: 456.78

Данный способ имеет премущества по сравнению с чтением через scanf , поскольку при считывании функция scanf удаляет из входного буфера только значения, которые соответствуют спецификаторам. Поэтому, если ввод через scanf не соответствует чему-либо, оставшиеся в буфере символы будут считываться при следующем вызове scanf.

sprintf

Функция sprintf производит обратное действие — записывает данные в строку:

int sprintf(char *_Buffer, const char *_Format, . )

В качестве первого параметра функция принимает указатель на буфер, в который идет запись. Второй параметр представляет строку форматирования. Кроме того, в качестве дополнеительных аргументов в функцию можно передавать дополнительные значения для спецификаторов из строки форматирования. Результатом функции является длина количество записанный символов плюс нулевой символ.

#include void main (void) < int age = 38; char* name = "Tom"; char text[50]; int charNumber = sprintf (text, "Name: %s Age: %d\n", name, age); printf (text); // Name: Tom Age: 38 printf("text length: %d", charNumber); // text length: 19 >

В данном случае в переменную text записывается строка «Name: %s Age: %d\n» , в которую вместо спецификаторов подставляются значения переменных name и age .

Sscanf си что это

Группа функций scanf считывает вводимую информацию в соответствии с форматом format так, кaк описано ниже. Этот формат может включать в себя определители преобразования ; результаты каждого преобразования, если они производились, будут сохраняться c помощью параметров указателя . Функция scanf считывает информацию, прибывающую из стандартного потока ввода stdin ; fscanf считывает информацию из потока, на который указывает stream , а sscanf считывает информацию из символьной строки, на которую указывает str .

Функция vfscanf является аналогом vfprintf (3) и читает информацию из потока, на который указывает stream , используя список указателей (см. stdarg (3)). Функция vscanf считывает список переменных аргументов из стандартного ввода, а функция vsscanf считывает его из строки. Эти функции являются аналогами функций vprintf и vsprintf соответственно.

Каждый последующий указатель на аргумент должен полностью соответствовать определителю преобразования (однако, обратите внимание на знак отключения («supressor»), описанный ниже). Все определители обозначены символом % (знаком процента). Строка format может также содержать другие символы. Пустые символы (такие, как пробел, табуляция или перевод строки) в строке format соответствуют любому количеству пустых символов (даже нулю) в строке ввода. Все остальные символы соответствуют только сами себе. Считывание прекращается, когда вводимый символ не соответствует форматному символу. Считывание также прекращается, если преобразование входящих данных не может быть произведено (см. ниже).

ПРЕОБРАЗОВАНИЯ

После символа % , обозначающего преобразование, может быть некоторое количество символов flag из множества, обозначенного ниже: * — знак отключения, или «подавитель» (supressor). Последующее преобразование работает как обычно, но указатель уже не используется. Результат преобразования не учитывается. a (glibc) Обозначает, что преобразование будет равно s , необходимая область памяти для строки будет выделена посредством malloc, а указатель на него станет указателем на переменную char , которая не должна быть заранее инициализирована. Этого преобразователя нет в ANSI C (C89) и он имеет другое значение в C99. a (C99) Эквивалентно f . h Обозначает, что преобразователь будет равен dioux или n и следующий указатель является указателем на short int (не на int ). l Обозначает, что преобразователь будет dioux или n и следующий указатель обозначает long int (не int ), или на то, что преобразователь будет одним из efg и следующий указатель обозначает double (не float ). Два флага l эквивалентны флагу L. L Обозначает, что преобразователь будет либо efg (и следующий указатель будет являться указателем на long double), либо преобразователь будет dioux и следующий указатель является указателем на long long . Обратите внимание на то, что тип long long не является типом ANSI C . Программу, использующую его, нельзя перенести ни в какую другую архитектуру. q Является эквивалентом L. Этот флаг отсутствует в ANSI C .

Дополнением к этим флагам может быть необязательная максимальная ширина поля, выраженная целым десятичным числом и расположенная между знаком % и преобразованием. Если ширина не указана, по умолчанию используется «бесконечность»; в противном случае соответствующее количество символов считывается в процессе преобразования. До начала преобразования большинство преобразователей пропускают пробелы; эти пробелы не учитываются при определении ширины поля.

Существуют следующие преобразователи: % (определяет символ `%’. То есть `%%’ в форматной строке соответствует символу `%’ на входе); d (преобразователь знаковых десятичных целых; указатель должен являться указателем на переменную типа int ); D (является эквивалентом ld ; оно оставлено только для совместимости с предыдущими версиями. Примечание: только для libc4. В libc5 и glibc %D игнорируется, поэтому старые программы могут не работать.); i (преобразователь знакового целого числа; следующий указатель должен быть указателем на int . Целое число читается в шестнадцатеричной системе исчисления, если оно начинается с `0x’ или `0X’; в восьмеричной системе, если оно начинается с `0′; в любом другом случае — в десятичной системе. Используются только те символы, которые соответствуют используемой системе.); o (соответствует беззнаковому восьмеричному числу; следующий указатель должен являться указателем на unsigned int .); u (соответствует беззнаковому десятичному числу; следующий указатель должен являться указателем на unsigned int .); x (соответствует беззнаковому шестнадцатеричному числу; следующий указатель должен являться указателем на unsigned int .); X Эквивалентно x . f соответствует числу с плавающей точкой, необязательно со знаком; следующий указатель должен являться указателем на float . e Эквивалентно f . g Эквивалентно f . E Эквивалентно f . s (соответствует последовательности «непустых» символов; далее следует указатель на char , а массив должен быть достаточно большим, чтобы вместить всю входящую последовательность, включая завершающий символ NULL . Вводимая строка останавливается либо на пустом символе либо при достижении максимальной ширины поля.); c (соответствует последовательности из width символов (по умолчанию 1); далее следует указатель на char ; для вмещения всех символов (к ним не добавляется завершающий NULL ) должно быть достаточно места. Обычный пропуск начальных «пустых» символов отключен, поэтому для пропуска «пустых» символов в начале используйте явный пробел в формате.); [ (определяет «непустую» последовательность из определенного набора принятых символов; далее следует указатель на char ; для вмещения всех символов, включая завершающий NULL , должно быть достаточно места. Обычный пропуск начальных пустых символов отключен. Строка должна быть из символов в конкретном наборе или не в наборе; набор определяется символами между скобками [ и ] . Множество исключает из себя символы, если сразу после открывающейся скобки стоит символ ^ (циркумфлекс). Чтобы включить закрывающую скобку в набор, поставьте ее сразу после открывающей скобки или циркумфлекса; в любой другой позиции закрывающая скобка будет обозначать конец набора. Символ дефиса ( — ) также является специальным; когда он расположен между двумя другими символами, он добавляет все промежуточные символы к набору. Чтобы включить дефис в набор, поставьте его на последнее место перед закрывающей скобкой. Например, `[^]0-9-]’ означает набор `все символы, кроме закрывающей скобки, кроме чисел от нуля до 9-и и кроме дефиса’. Строка заканчивается либо при появлением символа, не включенного (или если с циркумфлексом, то включенного) в набор, либо при достижении максимальной ширины поля.); p (соответствует значению указателя в формате `%p’ для printf (3); далее должен следовать указатель на void ); n (ничего не ожидается; вместо этого символы, принятые до этого момента с ввода, сохраняются с помощью последующего указателя на int ). Это не преобразование, хотя оно также может быть «подавлено» при использовании флага * . В стандарте C сказано: `Использование директивы %n не увеличивает показания счетчика назначения, возвращаемые при завершении работы’,- но, видимо, это большая ошибка.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

Эти функции возвращают число полученных элементов ввода, количество которых может быть в действительности меньше количества принятых элементов или даже нуля (в случае ошибки). Ноль обозначает, что, несмотря на доступность данных, никаких преобразований не было сделано; обычно такое бывает из-за неправильности входящих символов, например, алфавитных символов для преобразования `%d’. Значение EOF возвращается в том случае, если до начала каких-либо преобразований произошла ошибка, например, наступает конца файла. Если происходит ошибка или наступает конец файла после нескольких преобразований, то число удачно завершенных преобразований возвращается.

СМ. ТАКЖЕ

strtol (3), strtoul (3), strtod (3), getc (3), printf (3)

СООТВЕТСТВИЕ СТАНДАРТАМ

Функции fscanf , scanf , и sscanf соответствуют стандарту ANSI X3.159-1989 («ANSI C»).

Флаг q указывается BSD 4.4 для long long , а флаги ll или L с преобразованиями чисел указываются в GNU

Версия этих функций в Linux основана на GNU -библиотеке libio . Более краткое описание можно найти в info -документации GNU libc (glibc-1.08).

НАЙДЕННЫЕ ОШИБКИ

Все функции полностью совместимы с ANSI X3.159-1989, но, кроме этого, они определяют дополнительные флаги q и a так же, как и измененное поведение флагов L и l . Последнее можно считать ошибкой, так как в этом случае поведение флагов, определенное в ANSI X3.159-1989, меняется.

Некоторые комбинации флагов, определенные в ANSI C , не имеют смысла даже для этого стандарта (например, %Ld ). Они могут иметь вполне определенное поведение в Linux, но это не значит, что они будут вести себя так же и в других системах. Поэтому лучше использовать флаги, не определенные в ANSI C , т.е. использовать q вместо L в комбинации с преобразованиями diouxX или ll .

Использование q в системе BSD 4.4 не похоже на описанное ранее, поскольку данный флаг может быть использован при изменяемых преобразованиях аналогично L .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *