Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Си.doc
Скачиваний:
11
Добавлен:
04.06.2015
Размер:
2.75 Mб
Скачать

Форматированный ввод

Форматированный ввод осуществляется функцией scanf, по своей структуре аналогичной функцииprintf:

Scanf(“формат”, аргументы);

Форматсодержит спецификации вводимых переменных, имена которых являются аргументами этой функции (списком ввода). Перед именем каждой переменной в списке ввода (кроме имен массивов и строк) ставится знак амперсанда&. Спецификации ввода полностью совпадают с аналогичными спецификациями вывода:

Int age, rost;

float weight;

char name[10];

printf(“\nВаше имя: ”);

scanf(“%s”, name);

printf(“\nВаш возраст: ”);

scanf(“%d”, &age);

printf(“\nВаш рост: ”);

scanf(“%d”, &rost);

printf(“\nВаш вес: ”);

scanf(“%f”, &weight);

После запуска программы на экран будет выведено:

Ваше имя:

и программа будет ожидать ввода строки символов. После того, как будет напечатано имя и пользователь нажмет на клавишу ввода, программа заработает дальше:

Ваше имя: Петр

Ваш возраст: 17

Ваш рост: 178

Ваш вес: 67.5

Значения переменных можно вводить одной строкой, разделяя ихпробелами, при этом между спецификациями ввода в форматеникакихзнаков не ставится:

printf(“\nВаше имя, возраст, рост и вес: ”);

scanf(“%s%d%d%f”, name, &age, &rost, &weight);

При выполнении этой программы появляется сообщение, после которого можно вводитьчерезпробелызначения соответствующих переменных:

Ваше имя, возраст, рост и вес: Петр 17 178 67.5

При этом переменным name, age, rost, weight будут присвоены введенные значения.

В формат ввода, помимо спецификаций, могут входить и другие символы, причем:

  • пробелы, символы табуляции \t и перехода на новую строку\n игнорируются,

  • другие символы, если они имеются, должны совпадать с очередными непустыми символами, вводимыми с клавиатуры (символами входного потока), то есть они образуютшаблон, с которым должны совпадать вводимые данные:

scanf(“Возраст=%d, рост=%d, вес=%g, имя:%s”, &age, &rost, &weight, name);

входной поток имеет вид:

Возраст=17, рост=178, вес=67.5, имя:Петр

В этом случае переменные age, rost, weight, name примут соответствующие введенные значения.

Если перед спецификатором ввода стоит звездочка * , то поле, относящееся к данному спецификатору в списке ввода, пропускается, и вводимое значение игнорируется. Такая ситуация возникает тогда, когда вводятся значения из файла или с клавиатуры, ноодной строкой(при этом они должны разделятьсяпробелами):

printf(“\nВаше имя, возраст, рост и вес: ”);

scanf(“%s%d%*d%*f”, name, &age, &rost, &weight);

Входной поток имеет вид:

Петр 17 178 67.5

В этом случае переменным будут присвоены следующие значения:

name=”Петр” age=17 rost=0 weight=0.000000

Внимание!Если переменная не инициализирована, то ее значениеобнуляется.

Для ввода строкмогут быть использованы две дополнительные спецификации:

%[символы]- вводимая строка должна содержать только символы, перечисленные в квадратных скобках без разделительных знаков. При появлении во вводимой строке неуказанного символа ввод строки заканчивается:

printf(“\nВведите строку:”);

scanf(“%[abceg]”, name);

Если вводимая строка имеет вид:

abcdefg

то переменная name примет значениеabc

%[^символы] - вводимая строка ограничивается только символами, указанными в квадратных скобках:

printf(“\nВведите строку:”);

scanf(“%[^aed]”, name);

Если вводимая строка имеет вид:

abcdefg

то переменная name примет значениеae

Любая функция в Сивозвращает какое-то значение. Поэтому функцияscanf, помимо выполнения форматированного ввода, возвращает количество опознанных и присвоенных элементам списка ввода данных:

printf(“\nВаше имя, возраст, рост и вес: ”);

i=scanf(“%s%d%d%f”, name, &age, &rost, &weight);

Входной поток имеет вид:

Петр 17 178 67.5

При этом переменные name, age, rost, weight получат свои значения, и переменнойiбудет присвоено значение4.

Внимание!Использование функцииscanfдля ввода строк имеет свои особенности.

Если вводимая строка состоит из нескольких слов, разделенных пробелами, то вводится только первое слово (до первого пробела):

char name[20];

printf(“\nВведите ваше имя и фамилию: ”);

scanf(“%s”, name);

Если входной поток имеет вид:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]