Если вы разобрались с тем, как устроены различные типы, можно приступить к изучению консольного ввода и вывода.
int foo = 0;
...
foo = 42;
Выведем значение на экран. Для этого нужна функция printf(). Для простоты будем указывать результат работы функции прямо в комментарии.
printf("%d", foo); // 42
Она проще, чем пытается казаться. Список аргументов (часть в скобках) начинается со строки формата (как и любая другая строка, она ограничивается двойными кавычками). Она может содержать много интересных вещей, но пока мы остановимся на спецификаторах типов. Спецификатор %d означает целое десятичное число (decimal). После строки формата следует название переменной. Вот на место %d и подставится её значение.
Создадим ещё одну переменную и выведем на экран их значения. Вот полный код программы.
#include <stdio.h>
int main()
{
int foo = 42;
int bar = 0;
printf("%d %d", foo, bar); // 42 0
return 0;
}
Кстати, обе переменные можно было объявить и инициализировать в одной строке.
int foo = 42, bar = 0;
Чтобы считать значение переменной с клавиатуры, понадобится функция scanf(). Она похожа на функцию printf(). Давайте считаем какое-нибудь число с клавиатуры и выведем его же на экран.
#include <stdio.h>
int main()
{
int foo = 0;
scanf("%d", &foo); // Считываем число с клавиатуры в переменную foo.
printf("%d", foo); // Выводим новое значение переменной foo на экран.
return 0;
}
Знак & не опечатка. В большинстве случаев в функции scanf() он требуется, но не всегда (оставим этот вопрос на будущее). Остановитесь и выполните несколько заданий по этой теме.
Функции ввода и вывода поддерживают множество спецификаторов.
int foo = 299792458;
printf("%d", foo); // 299792458
printf("%16d", foo); // 299792458 Выравнивание по правому краю.
printf("%-16d", foo); // 299792458 Выравнивание по левому краю.
printf("%*d", 16, foo); // 299792458 Изменяемая ширина поля.
printf("%016d", foo); // 0000000299792458 Заполнитель (не все типы, иногда игнорируется при указании точности).
printf("%+d", foo); // +299792458 Всегда со знаком.
printf("% d", foo); // 299792458 Минус или пробел в начале (приоритет ниже +).
printf("%#d", foo); // 299792458 Вывод с указанием формата (например, %#x будет выводить
// в 16-ричном формате и дописывать 0x).
float bar = 4.1868f;
printf("%f", bar); // 4.1868
printf("%.2f", bar); // 4.19 Точность.
printf("%10.f", bar); // 4.1868 Ширина поля.
printf("%10.2f", bar); // 4.19 Точность и ширина поля.
printf("%*.*f", 10, 2, bar); // 4.19
Флаги (типа знака - или пробела) также доступны.
Как вывести знак процента, если он используется в спецификаторах? Как поставить кавычку, если она означает конец и начало строки?
Существуют экзотические управляющие символы, вроде \a (сигнал), их можно найти в справочниках. Можно ввести символ с произвольным кодом. Например, \55 — символ с кодом 55 (символ 7). Можно задавать коды символов в восьмеричной системе (\032) и шестнадцатеричной (\xFF).
В качестве упражнения предлагаю разобрать следующую строку формата.
int foo = 12, bar = 13, width = 12;
printf("%*d%%d%d\n", width, foo, bar);
Разделим её на части: %*d (целое с шириной поля 12), %% (знак процента), d (просто символ), %d (ещё одно целое), \n (перенос строки). При выводе получается 12%d13.
Если вам просто нужно вывести строку или символ, то вместо функций форматированного вывода можно использовать функции попроще (некоторые из них могут признаваться устаревшими в новых стандартах).
puts("To be or not to be?");
putchar('@');