Ввод строк с помощью scanf
Часть раздела Логика и управление потоком путешествия по 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.
Попробуйте сами
#include <stdio.h>
int main() {
// TODO: Объявите здесь массивы символов
// TODO: Напишите здесь код для вывода приглашения и чтения ввода
// TODO: Выведите итоговое сообщение
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функцииПотренируйтесь самостоятельно: Онлайн-компилятор C