Жестко заданные числа (hardcoding) подходят для первой попытки, но реальное программное обеспечение должно реагировать на то, что вводят пользователи. Исходный фрагмент кода использовал константы. Он был статичным. Предсказуемым. Скучным.
Чтобы программа стала полезной, необходимо получать данные от пользователя во время выполнения программы. Для этого используется функция scanf. Она является противоположностью printf. Если printf выводит данные на экран, то scanf считывает их с клавиатуры.
Ниже показано, как обрабатывать базовый ввод целых чисел в C.
Захват пользовательского ввода
Нельзя просто объявить переменную и ожидать, что она магическим образом примет данные пользователя. Нужно запросить эти данные. Также необходимо указать компьютеру, куда следует сохранить эти данные. Именно поэтому scanf требует указателя (знак & ). Если вы забудете поставить амперсанд, программа может аварийно завершиться или записать мусор в память. Всегда используйте его для примитивных типов, таких как int.
Рассмотрите обновленную логику:
- Объявите переменные для хранения введенных данных и результата.
- Выведите подсказку (prompt) для пользователя, чтобы он знал, что вводить.
- Используйте
scanfс правильным спецификатором формата (%dдля целых чисел). - Выполните вычисление, используя сохраненные значения.
- Выведите результат, включив переменные ввода в строку вывода.
Почему это важно
Переход от констант к переменным меняет всё. Программа больше не повторяется как заезженная пластинка. Она адаптируется. Вы можете запустить её один раз с числами 5 и 7. Вы можете запустить её снова с числами 100 и 200. Логика остается прежней; меняются данные.
Это основа интерактивных приложений командной строки (CLI). Прежде чем создавать сложные инструменты, необходимо понять, как безопасно получать данные в переменные.
Ключевые выводы
scanfтребует указателя: Всегда используйте оператор взятия адреса (&) перед именем переменной вscanf.- Спецификаторы формата должны совпадать: Если вы читаете
int, вы обязаны использовать%d. Использование%fдля целого числа приведет к неопределенному поведению. - Подсказки (prompts) критически важны: Без четкой подсказки, такой как «Enter the first value:», пользователь останется смотреть на мигающий курсор, задаваясь вопросом, зависла программа или нет. Не зависла. Она просто ожидает ввода.
Код работает. Он прост. Но он функционален. Вы перешли от статичного скрипта к динамичному инструменту. Следующим шагом обычно становится обработка ошибок. Что произойдет, если пользователь введет «hello» вместо числа? scanf завершится неудачей молча, оставив ваши переменные неинициализированными. Это проблема на другой день.
А пока у вас есть программа, которая действительно прислушивается.
Ввод, вывод и правила взаимодействия
Вы внесли изменения. Теперь скомпилируйте код. Запустите его. Если программа аварийно завершает работу, не паникуйте. Скорее всего, вы пропустили какую-то мелкую деталь синтаксиса.
Возьмите функцию scanf. Она использует строки формата аналогично printf. Введите man scanf, если вам нужна подробная документация. Но обратите внимание на амперсанд (& ) перед переменными, такими как a и b.
Это оператор адреса.
Он возвращает адрес памяти переменной. Сейчас это может показаться запутанным. Указатели прояснят этот вопрос позже. Но пока следуйте правилу: если вы используете scanf для char, int или float, вам необходим &. Он также требуется для структур.
Пропустите &? Вы получите ошибку времени выполнения. Намеренно нарушьте это правило. Посмотрите, что произойдет. Это единственный способ запомнить, почему это важно.
Точное форматирование вывода
Давайте разберем printf. Начнем с простого.
printf("Hello");
Эта команда отправляет слово «Hello» в стандартный вывод. Ничего больше. Без перевода строки. Курсор остается сразу после буквы «o».
Теперь добавим перевод строки.
printf("Hello\n");
\n вызывает возврат каретки. Вывод заканчивается на собственной строке. Это стандартное ожидание для чистого консольного вывода.
Для переменных требуются заполнители. Чтобы вывести значение b :
printf("%d", b);
%d — это заполнитель. Когда код выполняется, printf заменяет его фактическим целочисленным значением b.
Вы можете встраивать значения в предложения. Вы можете использовать несколько вызовов подряд:
printf("The temperature is "); printf("%d", b); printf(" degrees\n");
Но это утомительно. Более чистый подход заключается в объединении их в одну строку формата:
printf("The temperature is %d degrees\n", b);
Также можно выводить несколько значений.
printf("%d + %d = %d\n", a, b, c);
Здесь кроется ловушка. Количество заполнителей в строке формата должно точно соответствовать количеству переменных, следующих за ней. Точно.
Если у вас есть три тега %d, вам нужно три параметра. Типы должны совпадать. Порядок должен совпадать. Нарушите эти правила? Вывод будет мусором. Или, что хуже, программа аварийно завершит работу.
Соответствие типов заполнителям
printf обрабатывает большинство стандартных типов C. Вам просто нужно использовать правильный код.
- int использует
%d - float использует
%f - char использует
%c - строки символов используют
%s
Для более глубокого понимания проверьте man 3 printf в системе UNIX. Ваш конкретный компилятор, скорее всего, имеет руководство или файл справки, охватывающий крайние случаи.
Распространенные ошибки
Новички постоянно спотыкаются об эти моменты.
Регистр символов имеет строгое значение. printf пишется строчными буквами. Printf или PRINTF приведут к ошибке.
scanf требует оператора адреса (& ). Забудьте о нем, и программа не сохранит ваш ввод правильно.
Количество параметров имеет значение. Слишком много или слишком мало аргументов в printf или scanf приводит к неопределенному поведению.
Объявление должно предшествовать использованию. Вы не можете использовать имя переменной в C, не объявив его заранее. Компилятор должен знать структуру памяти и тип заранее.
Компилятор не догадывается. Он требует строгого соблюдения правил.






















