Ввод и вывод функций в C
Здравствуйте, будущие программисты! Сегодня мы отправляемся в увлекательное путешествие в мир ввода и вывода (I/O) в программировании на языке C. Как ваш доброжелательный компьютерный учитель, я здесь, чтобы помочь вам освоить этот важный аспект программирования. Так что достаньте свои виртуальные блокноты и погружайтесь с нами!
Стандартные файлы в C
Прежде чем мы начнем набирать текст на своих клавиатурах, давайте поговорим о чем-то основополагающем: стандартных файлах в C. Вы видите, когда вы запускаете программу на C, она автоматически открывает для вас три файла. Это как если бы у вас было три помощника, готовых управлять взаимодействием вашей программы с внешним миром.
- stdin (Стандартный ввод)
- stdout (Стандартный вывод)
- stderr (Стандартная ошибка)
Эти файлы являются воротами вашей программы к пользователю и системе. Представьте stdin как уши вашей программы, stdout как ее рот, а stderr как способ крика, когда что-то идет не так. Круто, правда?
Типы функций ввода и вывода
Теперь давайте поговорим о инструментах, которые мы используем для взаимодействия с этими файлами. В C у нас есть два основных типа функций I/O:
- Неформатированные функции I/O
- Форматированные функции 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