Ввод строк с помощью scanf
Часть раздела Logic & Flow путешествия по C на Coddy — урок 14 из 63.
Теперь, когда вы понимаете, как работают строки с нулевым терминатором, пришло время узнать, как получать строковый ввод от пользователей. Функция scanf может считывать строки, используя спецификатор формата %s, но она имеет важные ограничения, которые вам необходимо понимать.
Чтобы прочитать строку с помощью scanf, используйте формат %s и передайте имя вашего символьного массива (без оператора &, так как имена массивов уже являются адресами):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Однако scanf("%s", ...) имеет критическое ограничение: она прекращает чтение, как только встречает любой пробельный символ (пробел, табуляцию или символ новой строки). Это означает, что если пользователь введет "Hello World", scanf захватит только "Hello" и оставит "World" в буфере ввода.
Еще одна серьезная проблема заключается в том, что scanf не проверяет, помещается ли ввод в ваш массив. Если кто-то введет слово длиннее, чем может вместить ваш массив, это вызовет переполнение буфера, что может привести к сбою программы или созданию уязвимостей в системе безопасности. Всегда следите за тем, чтобы ваш символьный массив был достаточно большим для ожидаемого ввода.
Несмотря на эти ограничения, scanf("%s", ...) прекрасно подходит для чтения отдельных слов, что как раз и будет практиковаться в предстоящем испытании.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует чтение строкового ввода от пользователя с помощью scanf и его последующий вывод. Ваша программа должна:
- Объявить символьный массив с именем
usernameиз 30 элементов для хранения ввода пользователя - Объявить символьный массив с именем
hobbyиз 25 элементов для хранения другого ввода - Использовать
printf, чтобы вывести пользователю подсказку "Enter your username:" - Использовать
scanfсо спецификатором формата%sдля чтения имени пользователя в массивusername - Использовать
printf, чтобы вывести пользователю подсказку "Enter your hobby:" - Использовать
scanfсо спецификатором формата%sдля чтения хобби в массивhobby - Вывести обе строки с помощью
printfв точном формате, указанном ниже
Ввод будет предоставлен в виде двух отдельных слов (без пробелов внутри каждого слова).
Ваш вывод должен отображать результаты в следующем формате:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Например, если пользователь вводит "Alice" в качестве имени пользователя и "reading" в качестве хобби, вывод должен быть следующим:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Эта задача проверяет ваше понимание использования scanf со спецификатором формата %s для чтения строкового ввода, правильного объявления символьного массива достаточного размера и объединения пользовательского ввода с форматированным выводом с помощью printf.
Шпаргалка
Для чтения строкового ввода от пользователей используйте scanf со спецификатором формата %s:
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Важные ограничения scanf("%s", ...):
- Прекращает чтение при обнаружении любого пробельного символа (пробел, табуляция, новая строка)
- Захватывает только отдельные слова — "Hello World" превращается просто в "Hello"
- Нет защиты от переполнения буфера — убедитесь, что ваш массив достаточно велик
- Не используйте оператор
&с именами массивов (они уже являются адресами)
Попробуйте сами
#include <stdio.h>
int main() {
// TODO: Объявите здесь свои массивы символов
// TODO: Напишите здесь свой код для запроса и чтения ввода
// TODO: Выведите финальное сообщение
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции