Menu
Coddy logo textTech

Ввод строк с помощью 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", ...) прекрасно подходит для чтения отдельных слов, что как раз и будет практиковаться в предстоящем испытании.

challenge icon

Задание

Легко

Напишите программу на языке C, которая демонстрирует чтение строкового ввода от пользователя с помощью scanf и его последующий вывод. Ваша программа должна:

  1. Объявить символьный массив с именем username из 30 элементов для хранения ввода пользователя
  2. Объявить символьный массив с именем hobby из 25 элементов для хранения другого ввода
  3. Использовать printf, чтобы вывести пользователю подсказку "Enter your username:"
  4. Использовать scanf со спецификатором формата %s для чтения имени пользователя в массив username
  5. Использовать printf, чтобы вывести пользователю подсказку "Enter your hobby:"
  6. Использовать scanf со спецификатором формата %s для чтения хобби в массив hobby
  7. Вывести обе строки с помощью 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow