Статьи‎ > ‎

printf & scanf

Общий синтаксис

printf("строка_формата", дополнительные_аргументы);
scanf("строка_формата", дополнительные_аргументы);

Простой пример
Код:
   
printf("%d + %d = %d\n", 2, 2, 4);
   
    char where[100];
    int house;
    scanf("%s%d", where, &house);

    printf("My name is %s. I live at %s, %d.\n", "Boris", where, house);
Ввод с клавиатуры:
Kremlin 1

Результат:

2 + 2 = 4
Kremlin 1
My name is Boris. I live at Kremlin, 1.

Два правила
Чтобы избежать мелких, но неприятных ошибок, связанных с данными функциями, советую запомнить
два правила:
  1. При вызове каждой из этих функций "дополнительных аргументов" должно быть ровно столько же, сколько знаков % в "строке формата".
  2. При вызове scanf перед каждым "дополнительным аргументом" ставится знак '&' (операция взятия адреса). Исключение составляют аргументы типа char* (им соответствует формат %s) -- так как они и без того представляют собой адреса.
Базовое использование

Для функции printf строка формата содержит непосредственно текст, который будет выведен на экран. За одним исключением: в любом месте этой строки сочетание символа '%' с некоторой буквой считается специальным "подстановочным символом" и при выводе заменяется на текстовое представление очередного из "дополнительных аргументов". Количество "подстановочных символов" в "строке формата" должно совпадать с количеством "дополнительных аргументов".

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

Сразу после знака '%' в "подстановочном символе" ставится буква, указывающая тип соответствующего значения (при вводе или выводе). Наиболее распространены следующие варианты:
%d -- считывается/выводится целое число, соответствующий "дополнительный аргумент" имеет тип int;
%f --
считывается/выводится число с плавающей точкой, соответствующий "дополнительный аргумент" имеет тип double;
-- считывается/выводится один символ, соответствующий "дополнительный аргумент" имеет тип char;
%s -- считывается/выводится строка, соответствующий "дополнительный аргумент" имеет тип char*.

Более гибкое использование

Первое.
Общий формат "подстановочного символа" на самом деле выглядит так:
%[flags][width][.precision][{h | l | ll | I | I32 | I64}]type

где:
type - одна из перечисленных выше букв;
width - минимальное количество выводимых символов (если значение "не дотягивает" - то происходит дополнение пробелами);
precision - максимальное количество знаков после запятой;
flags - определяет параметры выравнивания (вправо/влево), обязательность вывода знака числа и т.п.;
h, l, ll и прочее - позволяет уточнить разрядность соответствующей переменной. Наиболее часто используются следующие сочетания данного параметра с буквой типа (type):
%ld - тип long int;
%lld - тип long long int;
%hd - тип short int;
%lf - тип long double;

Например, код
    long long cnt = 123456789012345;
    printf("Value:%7.3f, count:%lld", 3.1415926536, cnt);
выведет
    Value:  3.142, count:123456789012345
(т.е. произойдет дополнение пробелами слева и округление до 3-го знака дробного числа, а также корректный вывод "очень длинного целого").

Второе. Значения, считываемые с клавиатуры scanf'ом, бывают разделены не только пробелами. В этих случаях в "строке формата" непосредственно указываются те символы, которые следует ожидать на входе между вводимыми значениями. Например, следующий фрагмент считывает с клавиатуры дату в формате yyyy/dd/mm и распечатывает ее в формате dd.mm.yyyy:
    int d, m, y;
    scanf("%d/%d/%d", &y, &m, &d);
    printf("%02d.%02d.%d", d, m, y);
(обратите внимание на символы '/' в формате scanf'а).

Ссылки
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
http://msdn.microsoft.com/en-us/library/56e442dc%28v=vs.71%29.aspx

Comments