Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 6:

Буферизированный (потоковый) ввод-вывод

6.4. Приложение №1. Описание функций sprintf и sscanf

ФУНКЦИЯ SPRINTF
ОПРЕДЕЛЕНА В: <stdio.h>
СИНТАКСИС: int sprintf( buffer, format_string[, argument...]);
  • char *buffer - символьная строка, в которую записывается результат вывода переменных, заданных параметрами argument, отформатированных с помощью строки форматов;
  • const char *format_string - строка форматов для вывода аргументов;
НАЗНАЧЕНИЕ: Вывод значений переменных в заданный буфер при помощи строки форматов;
ОПИСАНИЕ: Функция sprintf форматирует и выводит последовательности символов и значений аргументов в символьный массив, адрес которого задаётся значением аргумента buffer. Каждый аргумент преобразуется и выводится согласно соответствующей спецификации в строке, адрес которой задаётся значением параметра format_string. Строка описания формата вывода интерпретируется так же, как и для функции printf.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число символов, помещённых в строку, адрес которой задаётся значением параметра buffer.
ПЕРЕНОСИМОСТЬ: Стандарт ANSI, работает во всех реализациях Си;

ФУНКЦИЯ SSCANF
ОПРЕДЕЛЕНА В: <stdio.h>
СИНТАКСИС: int sscanf( buffer, format_string[, argument...]);
  • const char *buffer - символьная строка, из которой считывается значения переменных, заданных параметрами argument и формируемых с помощью строки форматов;
  • const char *format_string - строка форматов для ввода аргументов;
НАЗНАЧЕНИЕ: Чтение значений переменных из заданного буфера при помощи строки форматов;
ОПИСАНИЕ: Функция sscanf читает данные из символьного массива, адрес которого задаётся значением переменной buffer, в переменные, адреса которых задаются аргументами arguments. Каждый аргумент должен быть указателем на переменную с типом, соответствующему типу, определённому в строке описания формата, адрес которой задаётся значением параметра format_string. Строка описания формата управляет интерпретацией входных полей и имеет тот же вид, что и для функции scanf.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не включает поля, которые были прочитаны, но не были присвоены. Значение EOF, если была попытка прочитать символ конца строки. Значение "0", если не было присвоенных полей.
ПЕРЕНОСИМОСТЬ: Стандарт ANSI, работает во всех реализациях Си;

ФУНКЦИЯ scanf
ОПРЕДЕЛЕНА В: <stdio.h>
СИНТАКСИС:
int scanf( format_string[,argument…] );
char *format_string;
НАЗНАЧЕНИЕ: Функция scanf читает данные из стандартного потока ввода stdin в переменные, адреса которых задаются аргументами arguments. Функция имеет переменное число параметров;
ОПИСАНИЕ: Значение параметра format_string задаёт адрес строки, которая управляет интерпретацией вводимых полей. Каждый последующий аргумент должен быть указателем на переменную типа, соответствующей типу, определённой в строке формата. Строка описания формата ввода может содержать:
  • Пробельные символы: ' ', '\t', '\n'. Если пробельный символ встретился в строке формата, то с этого момента пробельные символы считываются из потока ввода вплоть до первого символа, не являющимися пробельным, но не участвуют в присвоении значений (т.е. игнорируются);
  • Печатные символы - все прочие символы, не являющиеся символом '%', эти символы считываются из потока и проверяются на соответствие символам строки формата. Если нет совпадения символов в строке и стандартном потоке, считывание символов прекращается, и функция возвращает ошибку;
  • Спецификация формата, начинающаяся со знака '%'. Спецификация формата заставляет функцию прочитать и преобразовать символы на входе в значение указанной аргументах переменной. Значение присваивается переменной, адрес которой указан в списке аргументов;
Строка форматов читается слева направо. Входное поле, выделяемое из потока ввода, включает в себя все символы вплоть до первого пробельного символа, первого символа, который не может быть преобразован в значение переменной в соответствии со спецификацией, или когда прочитано число символов, определённой в модификаторе width. Лишние символы из входного потока игнорируются. При задании аргументов меньше, чем в строке формата, результат не определён;
ПРИМЕЧАНИЕ: SCANF часто приводит к непредсказуемым результатам, когда Вы отклоняетесь от точного шаблона. Вам следует помнить, что нужно указывать функции scanf, каким образом синхронизировать конец строки. В результате бывает предпочтительней комбинация из вызовов функций fgets и sscanf последовательно друг за другом;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не содержит полей, которые были прочитаны, но не присвоены;

EOF - Если была сделана попытка прочитать конец файла;

0 - если не было присваивания полей;

ПЕРЕНОСИМОСТЬ: Функция scanf поддерживается в операционных системах, основанных на UNIX, определена в стандарте ANSI C. Также функция определена в стандарте Кернигана и Ритчи.

ФУНКЦИЯ: gets
ОПРЕДЕЛЕНА В: <stdio.h>
СИНТАКСИС:
char *gets( s );
char *s;
НАЗНАЧЕНИЕ: Функция получает строку из потока;
ОПИСАНИЕ: Функция gets читает строку символов, оканчивающуюся символом перевода строки, в переменную s из стандартного входного потока stdin. Данная символьная строка оканчивается символом перехода на новую строку, который при записи в s заменяется нулевым окончанием '\0' ;
ЗАМЕЧАНИЯ:
  1. В отличие от scanf, gets позволяет вводить строки, содержащие символы пробела и табуляции. Всё, что было введено до перевода каретки, помещается в s ;
  2. ВНИМАНИЕ! Данная функция может вызывать ошибки типа: "переполнения буфера", и с её помощью хакер может получить контроль над Вашим компьютером. При возможности заменяйте эту функцию функцией fgets ;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция gets возвращает строку s. При достижении конца файла (EOF) или ошибке возвращается NULL ;
ПЕРЕНОСИМОСТЬ: Функция поддерживается на операционных системах, основанных на UNIX и стандартом ANSI C.

ФУНКЦИЯ: getc
ОПРЕДЕЛЕНА В: <stdio.h>
СИНТАКСИС:
int getc( stream );
FILE *stream;
НАЗНАЧЕНИЕ: Функция вводит из потока символ;
ОПИСАНИЕ: Функция getc представляет собой макрокоманду, которая получает следующий по-порядку символ из входного потока stream и увеличивает указатель текущего положения в потоке на единицу;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция getc возвращает считанный символ после предварительного его преобразования в целый тип. При возникновении ситуации "конец файла" и при ошибке ввода она возвращает значение EOF;
ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, поддерживается стандартом ANSI C, и описана в стандарте Кернигана и Ритчи.

ФУНКЦИЯ: getchar
ОПРЕДЕЛЕНА В: <stdio.h>
СИНТАКСИС: int getchar();
НАЗНАЧЕНИЕ: Функция вводит символ из потока stdin ;
ОПИСАНИЕ: getchar - это макрокоманда, вводящая символ из потока stdin Она определена следующим образом: getc( stdin ) ;
ЗАМЕЧАНИЕ: getchar читает символы с stdin, который имеет буфер на одну строку. Поэтому она ничего не возвращает до тех пор, пока вы не нажмёте Enter ;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция getchar возвращает считанный символ после предварительного преобразования его в целый тип. При ошибке оно возвращает значение EOF;
ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, стандартом ANSI C, и описана в стандарте Кернигана и Ритчи.

Более подробное описание функций ввода на языке Си смотрите [3].

Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига