Ввод и вывод функций в C

Здравствуйте, будущие программисты! Сегодня мы отправляемся в увлекательное путешествие в мир ввода и вывода (I/O) в программировании на языке C. Как ваш доброжелательный компьютерный учитель, я здесь, чтобы помочь вам освоить этот важный аспект программирования. Так что достаньте свои виртуальные блокноты и погружайтесь с нами!

C - Input & Output

Стандартные файлы в C

Прежде чем мы начнем набирать текст на своих клавиатурах, давайте поговорим о чем-то основополагающем: стандартных файлах в C. Вы видите, когда вы запускаете программу на C, она автоматически открывает для вас три файла. Это как если бы у вас было три помощника, готовых управлять взаимодействием вашей программы с внешним миром.

  1. stdin (Стандартный ввод)
  2. stdout (Стандартный вывод)
  3. stderr (Стандартная ошибка)

Эти файлы являются воротами вашей программы к пользователю и системе. Представьте stdin как уши вашей программы, stdout как ее рот, а stderr как способ крика, когда что-то идет не так. Круто, правда?

Типы функций ввода и вывода

Теперь давайте поговорим о инструментах, которые мы используем для взаимодействия с этими файлами. В C у нас есть два основных типа функций I/O:

  1. Неформатированные функции I/O
  2. Форматированные функции I/O

Неформатированные функции работают с сырыми данными, в то время как форматированные функции позволяют нам указывать формат наших данных. Это какdifference между употреблением plain rice (неформатированные) и изысканно сервированным гастрономическим блюдом (форматированные). Оба выполняют свою задачу, но один дает вам больше контроля над презентацией!

Неформатированные функции ввода и вывода символов: getchar() и putchar()

Давайте начнем с простого неформатированного ввода-вывода символов. Знакомьтесь с нашими первыми двумя функциями: getchar() и putchar().

getchar()

getchar() читает один символ из стандартного ввода (обычно вашей клавиатуры). Это как терпеливый слушатель, ждущий, чтобы вы ввели всего один символ.

#include <stdio.h>

int main() {
char ch;
printf("Введите символ: ");
ch = getchar();
printf("Вы ввели: ");
putchar(ch);
return 0;
}

В этом примере getchar() ждет, пока вы введете символ, и сохраняет его в переменную ch. Это так просто, но так мощно!

putchar()

putchar() — это counterpart к getchar(). Он выводит один символ в стандартный вывод (обычно ваш экран). Это как глашатай, объявляющий одну букву за другой.

#include <stdio.h>

int main() {
char ch = 'A';
printf("Печать символа: ");
putchar(ch);
return 0;
}

Здесь putchar(ch) отображает символ 'A' на вашем экране. Просто и эффективно!

Форматированные функции ввода и вывода строк: gets(), fgets(), puts(), и fputs()

Теперь давайте повысим уровень и поговорим о вводе-выводе строк. Эти функции работают с целыми строками, а не с отдельными символами.

gets() и fgets()

gets() читает строку из stdin в буфер. Однако его считают небезопасным, так как он не проверяет переполнение буфера. Вот почему мы предпочитаем его более безопасного родственника, fgets().

#include <stdio.h>

int main() {
char name[50];
printf("Введите ваше имя: ");
fgets(name, sizeof(name), stdin);
printf("Здравствуйте, %s", name);
return 0;
}

В этом примере fgets() читает строку текста (ваше имя) в массив name. Это безопаснее, так как мы указываем максимальное количество символов для чтения.

puts() и fputs()

puts() пишет строку в stdout и добавляет перевод строки. Его аналог для файловых потоков — fputs().

#include <stdio.h>

int main() {
char greeting[] = "Здравствуйте, мир!";
puts(greeting);  // Выводит: Здравствуйте, мир! (с переводом строки)
fputs(greeting, stdout);  // Выводит: Здравствуйте, мир! (без перевода строки)
return 0;
}

puts() автоматически добавляет перевод строки, в то время как fputs() дает вам больше контроля.

Форматированные функции ввода и вывода: scanf() и printf()

Теперь мы переходим к «тяжеловесам» ввода-вывода в C: scanf() и printf(). Эти функции resemble швейцарские армейские ножи I/O — универсальные и мощные.

scanf()

scanf() читает форматированный ввод из stdin. Это как капризный едок, который принимает только пищу, приготовленную exactly по его вкусу.

#include <stdio.h>

int main() {
int age;
float height;
printf("Введите ваш возраст и рост: ");
scanf("%d %f", &age, &height);
printf("Вы aged %d лет и %.2f метров роста.\n", age, height);
return 0;
}

Здесь scanf() читает целое число (%d) и浮点数 (%f) из ввода. Символ & перед age и height важен — он говорит scanf(), где хранить значения.

printf()

printf() — это выводной аналог scanf(). Это как виртуозный рассказчик, который плетет ваши данные в красиво форматированные строки.

#include <stdio.h>

int main() {
int apples = 5;
float price = 0.75;
printf("У меня есть %d яблок, каждое costing $%.2f.\n", apples, price);
return 0;
}

В этом примере printf() форматирует наши данные в nice, читаемую фразу.

Форматные спецификаторы в C

Форматные спецификаторы — это secret sauce, который делает scanf() и printf() такими мощными. Это как инструкции, говорящие этим функциям, как интерпретировать или представлять данные.

Вот удобная таблица.common форматных спецификаторов:

Спецификатор Тип данных
%d Целое число
%f Float
%c Символ
%s Строка
%lf Double
%x Шестнадцатеричное
%o Восьмеричное
%p Указатель

Помните, вы можете модифицировать эти спецификаторы. Например, %.2f выводит浮点ное число с 2 знаками после запятой, а %5d выводит целое число в field width 5 символов.

И вот мы и добрались до basics ввода и вывода в C. Помните, практика makes perfect. Так что выйди и начни программировать! Кто знает? Может быть, ты создашь следующее big thing в технике. До свидания, счастливого программирования!

Credits: Image by storyset