Загрузка [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js
 

printВвод-вывод

printВвод

Для ввода используются следующие функции:

для char для wchar_t Назначение
getchar() int getwchar() wint_t Ввод одного символа. Возвращает код введенного символа или EOF (конец файла)
scanf(fmt,...) int wscanf(wfmt,...) int Форматированный ввод. Возвращает количество успешно введенных значений или EOF (конец файла)

Код символа принимает значение от 0 до 255 (буква 'я'). Значение константы EOF равно -1. При сохранении результата в char невозможно отличить ввод буквы 'я' от конца файла. Пример ввода по одному символу:

#include <stdio.h>
int main()
{ int a,b;
  a=getchar();
  b=getchar();
  printf("%d %d\n",a,b);
}
Ввод:

Выполнить
Вывод:

Проверьте, какой результат возвращает getchar в этом примере для пустых входных данных. Измените тип переменных a,b на char и введите символ 'я'.

Для имитации конца файла в консоли в Windows нужно нажать Ctrl-Z, затем Enter, в Linux - Ctrl-D.

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

В спецификаторе формата после % можно указать:

  • символ *, который означает, что значение по этому формату будет введено, но не будет помещаться в очередной аргумент;

  • максимальное количество символов, вводимых по указанному спецификатору.

  • Все непробельные символы в формате интерпретируются как обязательные символы, присутствующие во вводе. При несовпадении очередного вводимого символа и символа в формате выполнение ввода завершается с ошибкой.

  • Пробельные символы в формате приводят к пропуску последовательности пробельных символов во вводе. Ввод будет продолжен с первого непробельного символа. К пробельным символам относятся ' ','\t' и '\n'.

  • Все спецификаторы формата, кроме и %[набор] пропускают пробельные символы перед началом ввода. Ввод завершается при обнаружении первого символа, не соответствующего спецификатору, или при достижении ограничения на количество символов. Если ни одного символа, соответствующего спецификации не было введено, выполнение ввода завершается с ошибкой.

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

Пример ввода с ограничением количества символов.

#include <stdio.h>
int main()
{ int a,b,r;
  r=scanf("%1d%d",&a,&b);
  printf("r=%d a=%d b=%d\n",r,a,b);
}
Ввод:

Выполнить
Вывод:

Пример пропуска символов при вводе даты в формате d/m/y:

#include <stdio.h>
int main()
{ int d,m,y,r;
  d=m=y=-1;
  r=scanf("%d/%d/%d",&d,&m,&y); // только /
  printf("r=%d d=%d m=%d y=%d\n",r,d,m,y);
  d=m=y=-1;
  r=scanf("%d%*c%d%*c%d",&d,&m,&y); // любые разделители
  printf("r=%d d=%d m=%d y=%d\n",r,d,m,y);
}
Ввод:

Выполнить
Вывод:

Пример пропуска пробельных символов при ввода числа:

#include <stdio.h>
int main()
{ int k,r;
  char c;
  r=scanf("%d%c",&k,&c);
  printf("r=%d k=%d c=%d\n",r,k,c);
}
Ввод:

Выполнить
Вывод:

Проверьте, какой результат возвращает scanf в этих примерах для неправильных и пустых входных данных.

Для целых типов с фиксированным количество бит в <inttypes.h> определяются макросы для строк с форматами ввода и вывода:

#include <stdint.h>
#include <inttypes.h>
int main() {
  int64_t n;
  scanf("%" SCNd64, &n); // "%lld"
  printf("%5" PRId64 "\n", n); // "%5lld\n"
}

После PRI и SCN указывается буква для системы счисления или отсутствия знака (d, o, x, u), затем количество бит (8, 16, 32 или 64).

loading