Символ | Вводимые данные; тип аргумента |
---|---|
d | десятичное целое: int * |
i | целое: int *. Целое может быть восьмеричным (с 0 слева) или шестнадцатеричным (с 0x или 0X слева) |
o | восьмеричное целое (с нулем слева или без него); int * |
u | беззнаковое десятичное целое; unsigned int * |
x | шестнадцатеричное целое (с 0x или 0X слева или без них); int * |
c | символы; char *. Следующие символы ввода (по умолчанию один) размещаются в указанном месте. Обычный пропуск символов- разделителей подавляется; чтобы прочесть очередной символ, отличный от символа-разделителя, используйте %1s |
s | Строка символов(без обрамляющих кавычек); char *, указывающая на массив символов, достаточный для строки и завершающего символа '\0', который будет добавлен |
e, f, g | число с плавающей точкой, возможно, со знаком; обязательно присутствие либо десятичной точки, либо экспоненциальной части, а возможно, и обеих вместе; float * |
% | сам знак %, никакое присваивание не выполняется |
Чтобы построить первый пример, обратимся к программе калькулятора из главы 4, в которой организуем ввод с помощью функции
#include ‹stdio.h›
main /* программа-калькулятор */ {
double sum, v;
sum = 0;
while (scanf ("%lf", &v) == 1)
printf("\t%.2f\n", sum += v);
return 0;
}
Предположим, что нам нужно прочитать строки ввода, содержащие данные вида
25 дек 1988
Обращение к
int day, year; /* день, год */
char monthname[20]; /* название месяца */
scanf ("%d %s %d", &day, monthname, &year);
Знак
В строке формата могут присутствовать символы, не участвующие ни в одной из спецификаций; это значит, что эти символы должны появиться на вводе. Так, мы могли бы читать даты вида
int day, month, year; /* день, месяц, год */
scanf("%d/%d/%d", &day, &month, &year);
В своем формате функция
while (getline(line, sizeof(line)) › 0) {
if (sscanf(line, "%d %s %d", &day, monthname, &year) == 3)
printf("вepно: %s\r", line); /* в виде 25 дек 1968 */
else if (sscanf(line, "%d/%d/%d", &month, &day, &year) == 3)
printf("вepно: %s\n", line); /* в виде mm/dd/yy */
else
printf("неверно: %s\n", line); /* неверная форма даты */
}
Обращения к
В завершение еще раз напомним, что аргументы функций
Одна из самых распространенных ошибок состоит в том, что вместо того, чтобы написать
scanf ("%d",&n);
пишут
scanf("%d", n);
Компилятор о подобной ошибке ничего не сообщает.
Упражнение 7.4. Напишите свою версию