Два примера работы программы
Программа
Получился диалог
Пример
Пример
char *name;
scanf("%s", name);
Данная программа содержит ошибку, поскольку ЭВМ запишет строку по неизвестному адресу, так как *пате не инициализирован. Возможно «зависание» компьютера.
char | -k | name; | |||
name | = | (char | *)mall | oc | (10); |
scan | f ( | II Q. _ II О О f | name); |
Данная программа корректна. Однако, выделенной памяти может не хватить. Тогда часть символов будет записана в область, не предназначенную для этого. Доработанный вариант программы, считывающей только 9 символов, приведен ниже.
char | -k | name; | ||
name | = | (char | *)malloc | (10); |
scan | f ( | "%9s", | name); |
Как только выделена память для массива, можно считывать строку. Для ввода часто используют функции scanfn gets.
Функция gets получает строку от стандартного устройства ввода системы. Функция читает символы до тех пор, пока не встретится символ новой строки '\п', который создается при нажатии клавиши <Enter>. Функция берет все символы до (но не включая) символа новой строки, присоединяет к ним нулевой символ '\0' и передает строку вызывающей программе [4].
/^Получение имени №1.*/ main ( )
{
char name[81]; /^Выделение памяти под строку.*/
printf("Привет, как вас зовут?\п");
gets (name);
/*Размещение имени по адресу name.*/
printf("Хорошее имя, %s.\n" , name); }
Функция примет любое имя (включая пробелы) длиной до 80 символов.
/^Получение имени №2.*/ | |
main ( ) { char name[80]; | |
char *ptr; | |
printf("Привет, как вас | зовут?\п"); |
ptr = gets(name); | |
printf("%s? Ax! %s!\n", } | name, ptr); |
Привет, как | вас зовут? | |
Владимир | <Enter> | |
Владимир? | Ах | ! Владимир! |
Функция scan/. Основное различие между scarify gets заключается в том, как они определяют, что достигли конца строки; scan/ предназначена скорее для получения слова, а не строки. Функция gets принимает все символы до тех пор, пока не встретит первый символ новой строки.
Существует два варианта использования функции scan/[4]:
1. Если применять формат %s, строка вводится до (но не включая) следующего пустого символа (пробел, табуляция или новая строка).
2. Если определять размер строки как %\0s, то функция scan/ считает не более 10 символов или же считает до любого пришедшего первого пустого символа.
Функция scanf возвращает целое значение, равное числу считанных символов, если ввод прошел успешно, или символ EOF, если была попытка прочитать конец файла.
/* Использование main ( ) г | функции scanf( | ) .*/ | |||
char namel[40] int count; | , name2[11]; | ||||
printf(" Введите, пожалуйста, count = scanf("%s%6s", namel, | 2 имени: name2); | \n" ) ; | |||
} | printf ("Я считал %о! имени %s count, namel, name2); | и %s . | \n", | ||
Введите, пожалуйста, два имени:
Наталья Анна <Enter>
Я считал 2 имени Наталья и Анна.
Введите, пожалуйста, 2 имени.
Наталья Кристина <Enter>
Я считал 2 имени Наталья и Кристи.
Во втором примере были считаны только первые 6 символов от Кристины, так как использовался формат %6s.
Если с клавиатуры вводится только текст, лучше применять функцию gets. Она проще в использовании, быстрее и более компактна. Функция scanf предназначена в основном для ввода смеси типов данных в некоторой стандартной форме. Например, если каждая вводимая строка содержит наименование инструмента, количество его на складе и стоимость каждого инструмента, можно использовать функцию scanf
В следующем примере размер массива символов запрашивается у оператора.