Ввод в консоли. Функция scanf
Что такое функция scanf()
Функция scanf() позволяет считывать данные, введенные пользователем с клавиатуры.
scanf(строка_формата, адреса_переменных);
Важно
В scanf() перед именем переменной ставится символ & (амперсанд) — это адрес переменной в памяти.
Базовый ввод данных
Ввод целых чисел
#include <stdio.h>
int main() {
int age;
printf("Введите ваш возраст: ");
scanf("%d", &age); // Считываем целое число
printf("Вам %d лет\n", age);
return 0;
}
Ввод разных типов
- Целые числа
- Дробные числа
- Символы
#include <stdio.h>
int main() {
int number;
printf("Введите целое число: ");
scanf("%d", &number);
printf("Вы ввели: %d\n", number);
printf("Удвоенное значение: %d\n", number * 2);
return 0;
}
#include <stdio.h>
int main() {
float price;
printf("Введите цену товара: ");
scanf("%f", &price);
printf("Цена: %.2f руб.\n", price);
printf("С НДС 20%%: %.2f руб.\n", price * 1.20);
return 0;
}
#include <stdio.h>
int main() {
char grade;
printf("Введите вашу оценку (A/B/C/D/F): ");
scanf(" %c", &grade); // Пробел перед %c важен!
printf("Ваша оценка: %c\n", grade);
return 0;
}
Спецификаторы для scanf()
| Спецификатор | Тип переменной | Описание |
|---|---|---|
%d | int | Целое число |
%f | float | Дробное число |
%lf | double | Дробное число двойной точности |
%c | char | Один символ |
%s | char[] | Строка (без пробелов) |
Ввод нескольких значений
#include <stdio.h>
int main() {
int day, month, year;
printf("Введите дату (день месяц год): ");
scanf("%d %d %d", &day, &month, &year);
printf("Вы ввели дату: %02d.%02d.%d\n", day, month, year);
// Простая проверка
if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {
printf("✅ Дата корректна\n");
} else {
printf("❌ Дата некорректна\n");
}
return 0;
}
Ввод строк
Простой ввод строки
#include <stdio.h>
int main() {
char name[50]; // Резервируем место для имени
printf("Введите ваше имя: ");
scanf("%s", name); // Для строк & не нужен!
printf("Привет, %s!\n", name);
return 0;
}
Ограничение scanf() для строк
scanf("%s") читает только до первого пробела. Строка "Иван Петров" прочитается как "Иван".
Ввод строки с пробелами
- Проблема с пробелами
- Решение через fgets
#include <stdio.h>
int main() {
char firstName[30];
char lastName[30];
printf("Введите имя: ");
scanf("%s", firstName);
printf("Введите фамилию: ");
scanf("%s", lastName);
printf("Полное имя: %s %s\n", firstName, lastName);
return 0;
}
Ввод: Иван Петров
Результат: имя = "Иван", фамилия = "Петров"
#include <stdio.h>
int main() {
char fullName[100];
printf("Введите полное имя: ");
// Очищаем буфер
while (getchar() != '\n');
// Читаем строку с пробелами
fgets(fullName, sizeof(fullName), stdin);
printf("Ваше полное имя: %s", fullName);
return 0;
}
Практические примеры
Простой калькулятор
#include <stdio.h>
int main() {
float num1, num2;
char operation;
printf("=== КАЛЬКУЛЯТОР ===\n");
printf("Введите первое число: ");
scanf("%f", &num1);
printf("Введите операцию (+, -, *, /): ");
scanf(" %c", &operation); // Пробел перед %c!
printf("Введите второе число: ");
scanf("%f", &num2);
printf("\n%.2f %c %.2f = ", num1, operation, num2);
switch (operation) {
case '+':
printf("%.2f\n", num1 + num2);
break;
case '-':
printf("%.2f\n", num1 - num2);
break;
case '*':
printf("%.2f\n", num1 * num2);
break;
case '/':
if (num2 != 0) {
printf("%.2f\n", num1 / num2);
} else {
printf("Ошибка: деление на ноль!\n");
}
break;
default:
printf("Неизвестная операция\n");
}
return 0;
}
Обработка массива с вводом
#include <stdio.h>
int main() {
int students = 5;
int grades[5];
int sum = 0;
printf("Введите оценки %d студентов:\n", students);
// Ввод оценок
for (int i = 0; i < students; i++) {
printf("Студент %d: ", i + 1);
scanf("%d", &grades[i]);
sum += grades[i];
}
// Анализ результатов
float average = (float)sum / students;
int passed = 0;
printf("\n=== РЕЗУЛЬТАТЫ ===\n");
for (int i = 0; i < students; i++) {
printf("Студент %d: %d баллов", i + 1, grades[i]);
if (grades[i] >= 70) {
printf(" - Зачет ✅\n");
passed++;
} else {
printf(" - Незачет ❌\n");
}
}
printf("\nСредний балл: %.1f\n", average);
printf("Сдали: %d из %d студентов\n", passed, students);
return 0;
}
Валидация пользовательского ввода
Проверка корректности
- Проверка диапазона
- Повторный ввод при ошибке
#include <stdio.h>
int main() {
int month;
int valid = 0;
while (!valid) {
printf("Введите номер месяца (1-12): ");
scanf("%d", &month);
if (month >= 1 && month <= 12) {
valid = 1;
printf("✅ Корректный месяц: %d\n", month);
} else {
printf("❌ Ошибка! Месяц должен быть от 1 до 12\n");
}
}
return 0;
}
#include <stdio.h>
int main() {
float temperature;
int attempts = 0;
int maxAttempts = 3;
int success = 0;
printf("Введите температуру тела (35.0-42.0°C):\n");
while (attempts < maxAttempts && !success) {
attempts++;
printf("Попытка %d: ", attempts);
scanf("%f", &temperature);
if (temperature >= 35.0 && temperature <= 42.0) {
printf("✅ Температура %.1f°C записана\n", temperature);
success = 1;
} else {
printf("❌ Некорректное значение\n");
if (attempts < maxAttempts) {
printf("Попробуйте снова\n");
}
}
}
if (!success) {
printf("🔒 Превышено количество попыток\n");
}
return 0;
}
Интерактивные программы
Игра "Угадай число"
#include <stdio.h>
int main() {
int secretNumber = 42; // В реальности используйте случайные числа
int guess;
int attempts = 0;
int maxAttempts = 5;
printf("🎯 ИГРА: Угадайте число от 1 до 100\n");
printf("У вас %d попыток\n\n", maxAttempts);
while (attempts < maxAttempts) {
attempts++;
printf("Попытка %d: ", attempts);
scanf("%d", &guess);
if (guess == secretNumber) {
printf("🎉 Поздравляем! Вы угадали за %d попыток!\n", attempts);
break;
} else if (guess < secretNumber) {
printf("📈 Загаданное число больше\n");
} else {
printf("📉 Загаданное число меньше\n");
}
if (attempts < maxAttempts) {
printf("Осталось попыток: %d\n\n", maxAttempts - attempts);
}
}
if (guess != secretNumber) {
printf("😔 Попытки закончились. Загаданное число: %d\n", secretNumber);
}
return 0;
}
Очистка буфера ввода
Проблема с остатками в буфере
#include <stdio.h>
int main() {
int number;
char letter;
printf("Введите число: ");
scanf("%d", &number);
// Очищаем буфер от символа новой строки
while (getchar() != '\n');
printf("Введите символ: ");
scanf("%c", &letter);
printf("Число: %d, символ: '%c'\n", number, letter);
return 0;
}
Частые ошибки
Распространенные проблемы
// ❌ Забыть амперсанд (&) для переменных
int age;
scanf("%d", age); // Ошибка! Должно быть &age
// ❌ Использовать & для строк
char name[50];
scanf("%s", &name); // Ошибка! Должно быть просто name
// ❌ Неправильный спецификатор
float price;
scanf("%d", &price); // Ошибка! Для float нужен %f
// ❌ Забыть пробел перед %c
int num;
char ch;
scanf("%d", &num);
scanf("%c", &ch); // Прочитает символ новой строки!
// Правильно: scanf(" %c", &ch);
// ❌ Недостаточный размер для строки
char short_name[3];
scanf("%s", short_name); // Ввод "Александр" вызовет переполнение!
Безопасный ввод
Ограничение длины ввода
#include <stdio.h>
int main() {
char username[20];
char password[15];
printf("=== ВХОД В СИСТЕМУ ===\n");
// Ограничиваем ввод размером массива
printf("Логин (до 19 символов): ");
scanf("%19s", username); // Максимум 19 символов + '\0'
printf("Пароль (до 14 символов): ");
scanf("%14s", password); // Максимум 14 символов + '\0'
printf("\nВведенные данные:\n");
printf("Логин: %s\n", username);
printf("Пароль: %s\n", password);
return 0;
}
Проверка успешности ввода
- Проверка возвращаемого значения
- Цикл с проверкой
#include <stdio.h>
int main() {
int age;
int result;
printf("Введите ваш возраст: ");
result = scanf("%d", &age);
if (result == 1) {
printf("✅ Успешно прочитано число: %d\n", age);
} else {
printf("❌ Ошибка ввода! Введите число\n");
}
return 0;
}
#include <stdio.h>
int main() {
int score;
int success = 0;
printf("Введите балл от 0 до 100:\n");
while (!success) {
printf("Балл: ");
if (scanf("%d", &score) == 1) {
if (score >= 0 && score <= 100) {
success = 1;
printf("✅ Балл %d принят\n", score);
} else {
printf("❌ Балл должен быть от 0 до 100\n");
}
} else {
printf("❌ Введите число!\n");
// Очищаем буфер от некорректного ввода
while (getchar() != '\n');
}
}
return 0;
}
Интерактивные программы
Анкета пользователя
#include <stdio.h>
int main() {
char name[30];
int age;
char city[30];
float height;
printf("=== АНКЕТА ПОЛЬЗОВАТЕЛЯ ===\n\n");
printf("Как вас зовут? ");
scanf("%29s", name);
printf("Сколько вам лет? ");
scanf("%d", &age);
printf("В каком городе живете? ");
scanf("%29s", city);
printf("Ваш рост (в см)? ");
scanf("%f", &height);
printf("\n=== ВАШИ ДАННЫЕ ===\n");
printf("Имя: %s\n", name);
printf("Возраст: %d лет\n", age);
printf("Город: %s\n", city);
printf("Рост: %.0f см\n", height);
// Простой анализ
if (age >= 18) {
printf("Статус: Совершеннолетний\n");
} else {
printf("Статус: Несовершеннолетний\n");
}
return 0;
}
Обработка списка покупок
#include <stdio.h>
int main() {
int itemCount;
float prices[10]; // Максимум 10 товаров
float total = 0;
printf("=== СПИСОК ПОКУПОК ===\n");
printf("Сколько товаров? (макс. 10): ");
scanf("%d", &itemCount);
if (itemCount > 10) {
itemCount = 10;
printf("Ограничено до 10 товаров\n");
}
printf("\nВводите цены товаров:\n");
for (int i = 0; i < itemCount; i++) {
printf("Товар %d: ", i + 1);
scanf("%f", &prices[i]);
total += prices[i];
}
printf("\n=== ЧЕК ===\n");
for (int i = 0; i < itemCount; i++) {
printf("Товар %d: %.2f руб.\n", i + 1, prices[i]);
}
printf("-----------------\n");
printf("Итого: %.2f руб.\n", total);
printf("НДС (20%%): %.2f руб.\n", total * 0.20);
printf("К доплате: %.2f руб.\n", total * 1.20);
return 0;
}
Ввод данных в массивы
Заполнение массива с клавиатуры
#include <stdio.h>
int main() {
int size = 6;
int temperatures[6];
int sum = 0;
printf("Введите температуру за %d дней:\n", size);
for (int i = 0; i < size; i++) {
printf("День %d: ", i + 1);
scanf("%d", &temperatures[i]);
sum += temperatures[i];
}
// Находим самый теплый и холодный день
int maxTemp = temperatures[0];
int minTemp = temperatures[0];
int maxDay = 1, minDay = 1;
for (int i = 1; i < size; i++) {
if (temperatures[i] > maxTemp) {
maxTemp = temperatures[i];
maxDay = i + 1;
}
if (temperatures[i] < minTemp) {
minTemp = temperatures[i];
minDay = i + 1;
}
}
printf("\n=== АНАЛИЗ ===\n");
printf("Средняя температура: %.1f°C\n", (float)sum / size);
printf("Самый теплый день %d: %d°C\n", maxDay, maxTemp);
printf("Самый холодный день %d: %d°C\n", minDay, minTemp);
return 0;
}
Меню и пользовательский выбор
#include <stdio.h>
int main() {
int choice;
int running = 1;
int balance = 1000;
printf("💳 Добро пожаловать в банкомат!\n");
while (running) {
printf("\n=== ГЛАВНОЕ МЕНЮ ===\n");
printf("1. Проверить баланс\n");
printf("2. Снять деньги\n");
printf("3. Пополнить счет\n");
printf("0. Выход\n");
printf("Ваш выбор: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("💰 Ваш баланс: %d руб.\n", balance);
break;
case 2: {
int amount;
printf("Сумма для снятия: ");
scanf("%d", &amount);
if (amount > balance) {
printf("❌ Недостаточно средств\n");
} else if (amount <= 0) {
printf("❌ Сумма должна быть больше 0\n");
} else {
balance -= amount;
printf("✅ Снято %d руб. Остаток: %d руб.\n", amount, balance);
}
break;
}
case 3: {
int amount;
printf("Сумма пополнения: ");
scanf("%d", &amount);
if (amount > 0) {
balance += amount;
printf("✅ Счет пополнен на %d руб. Баланс: %d руб.\n", amount, balance);
} else {
printf("❌ Сумма должна быть больше 0\n");
}
break;
}
case 0:
printf("👋 До свидания!\n");
running = 0;
break;
default:
printf("❌ Неверный выбор\n");
}
}
return 0;
}
Лучшие практики
- Всегда используйте
&перед переменными (кроме строк) - Ограничивайте длину ввода строк:
scanf("%19s", str) - Проверяйте возвращаемое значение
scanf()для обработки ошибок - Очищайте буфер между вводом разных типов данных
- Проверяйте границы допустимых значений
Важно помнить
scanf()останавливается на пробелах при чтении строк- Символ новой строки остается в буфере после ввода числа
- Для строк с пробелами используйте
fgets() - Всегда резервируйте достаточно места для строк
Функция scanf() — основной инструмент для создания интерактивных программ, работающих с пользовательским вводом.