Шаг 9.
Функция scanf()

    На этом шаге мы познакомимся с основными возможностями функции scanf().

    Мы рассмотрим здесь лишь основные особенности применения функции scanf(). Так же, как и для функции printf(), для функции scanf() указываются управляющая строка и следующий за ней список аргументов.

    Обращение к этой функции имеет вид:

     scanf (Управляющая_строка,&Имя1,&Имя2,...,&ИмяN);,

где: 1) Имя1,Имя2,...,ИмяN - это имена переменных, значения которых надо ввести. Смысл символа "&" перед именем будет раскрыт ниже;
2) Управляющая_строка - это строка символов, которая задает количество и типы вводимых переменных. Делается это так: в формате указывается символ %, за которым следует буква, определяющая тип вводимой переменной.

    Сочетание %буква является спецификацией преобразования. При вводе мы будем пользоваться следующими спецификациями:

    Спецификации преобразования должны соответствовать количеству и типу вводимых переменных.

    К счастью, при применении функции scanf() мы ничего не должны знать о смысле символа "&". Необходимо запомнить только два правила.

  1. Если нужно ввести некоторое значение и присвоить его переменной одного из основных типов, то перед именем переменной требуется писать символ &.
  2. Если требуется ввести значение строковой переменной, то использовать символ & не нужно.

    Функция scanf() использует некоторые специальные знаки (пробелы, символы табуляции и символ "новая строка") для разбиения входных символов на отдельные поля. Она согласует последовательность спецификаций преобразования с последовательностью полей, опуская упомянутые специальные знаки между ними.

    При обращении к функции scanf() выполнение программы приостанавливается, и нужно ввести значения для указанных переменных, после чего работа программы продолжается.


    Пример 1.
   #include<stdio.h>
   main ()
   {
      int a,b,c,d,e;
      /* При вводе каждое число должно  */
      /* отделяться от другого пробелом */
      scanf ("\n %d%d%d%d%d",&a,&b,&c,&d,&e);
      printf ("\n  %d  %d  %d  %d  %d",a,b,c,d,e);
   }
Текст этой программы можно взять здесь.


    Пример 2.
   #include<stdio.h>
   main ()
   {
      int st,oc;
      printf ("Сколько лет Вы изучаете программирование?");
      scanf ("%d",&st);
      printf ("\nКакую оценку Вы получили на экзамене?");
      scanf ("%d",&oc);
      printf ("\nДля того, чтобы прилично изучить язык C++,
              \nВам понадобится %d - %d лет.\n",100/2/st/oc);
   }
Текст этой программы можно взять здесь.


    Пример 3.
   #include<stdio.h>
   main ()
   {
      int data,month,year;
      char name[15],town[15];
      /* ---------------------------------------- */
      printf ("Как вас зовут? "); scanf ("%s",name);
      printf ("Укажите дату, месяц и год вашего рождения.\n Дата: ");
      scanf ("%d",&data);
      printf ("Месяц (числом): "); scanf ("%d",&month);
      printf ("Год: "); scanf ("%d",&year);
      printf ("В каком городе? "); scanf ("%s",town);
      printf ("Вот мы о вас и узнали кое-что. А именно... \n");
      printf ("Вас зовут %s \n",name);
      printf ("Вы родились в городе %s (%d.%d.%d)",
              town,data,month,year);
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

   Как вас зовут? Иван
   Укажите дату, месяц и год вашего рождения.
   Дата: 14
   Месяц (числом): 10
   Год: 1986
   В каком городе?  Свердловск
   Вот мы о вас и узнали кое-что. А именно...
   Вас зовут  Иван
   Вы родились в городе Свердловск (14.10.1986)

   

    Остановимся более подробно на содержимом управляющей строки. Она содержит спецификации преобразования, которые используются для непосредственной интерпретации входной последовательности.

    Управляющая строка может содержать:

    Спецификация преобразования управляет преобразованием очередного входного поля. Результат обычно помещается в переменную, на которую ссылается соответствующий параметр. Однако, если присутствует символ "*", то входное поле просто пропускается, и никакого присваивания не производится.

    Перечислим основные символы преобразования:


    Пример 4. Иллюстрация использования символа "*".
   #include<stdio.h>
   main ()
   {
      int i,j,k;
      printf ("Вводи числа i, j, k\n");
      scanf ("%d %*d %d %d",&i,&j,&k);
      printf ("i=%d, j=%d, k=%d,\n",i,j,k);
      printf ("Вводи числа i, j, k\n");
      scanf ("%d %d %d",&i,&j,&k);
      printf ("i=%d, j=%d, k=%d,\n",i,j,k);
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

   Вводи числа i, j, k
   1 2 3 4
   i=1, j=3, k=4,
   Вводи числа i, j, k
   1 2 3 4
   i=1, j=2, k=3,


    Замечания.
1. Если замкнуть стандартный вход программы (prog) на файл infile, содержащий строку чисел: 1 2 3 4 5 6 7 8, командной строкой prog <infile , то результатом выполнения программы будут дважды напечатанные значения i=1, j=3, k=4,
2. Для строк допустим формат ввода %s без дополнительного указания размера поля и прочих параметров.



    Мы привели несколько примеров использования функции scanf(). На следующем шаге мы продолжим рассмотрение примеров использования основных типов, начатых на шаге 6.


Предыдущий шаг Содержание Следующий шаг