Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Применение функции scanf()



4. Символьные строки.

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

/* непринужденный разговор */

#define DENSITY 62.4 /* плотность тела человека в фунтах на кубический фут */

main() /* любопытствующая программа*/

{

float weight, volume;

int size, letters;

char name[40]; /* или попробуйте "static char name [40];" */

printf(" Привет! Как вас зовут?\n");

scanf("%s", name);

printf("%s, Каков ваш вес в фунтах?\n", name);

scanf("%f", &weight);

size = sizeof name;

letters = strlen (name);

volume = weight/DENSITY;

printf(" Прекрасно, %s, ваш объем %2.2f кубических фута.\n", name, volume);

printf("Кроме того, ваше имя состоит из %d букв,\n", letters);

printf("и для его размещения в памяти у нас есть %d байт,\n", size);

}

Перечислим основные новые черты этой программы.

1. Мы использовали «массив» для хранения «символьной строки» — в данном случае для некоторого имени.

2. При вводе и выводе строки была использована «спецификация преобразования» %s.

3. Для определения символической константы DENSITY был использован препроцессор языка Си.

4. Для нахождения длины строки была использована функция strlen().

7.1. Символьные строки.

«Символьная строка» — это последовательность, состоящая из одного или более символов. В качестве примера рассмотрим следующую строку:

"Строки изливались прямо из сердца!"

Кавычки не являются частью строки. Они вводятся только для того, чтобы отметить ее начало и конец, т. е. играют ту же роль, что и апострофы в случае одиночного символа.

В языке Си нет специального типа, который можно было бы использовать для описания строк. Вместо этого строки представляются в виде «массива» элементов типа char.

Необходимо отметить, что на рисунке последним элементом массива является символ \0. Это «нуль-символ», и в языке Си он используется для того, чтобы отмечать конец строки.

Ну, а теперь спросим, что такое массив? Массив можно представить себе как совокупность нескольких ячеек памяти, объединенных в одну строку. Если вы предпочитаете более формальные и строгие определения, то массив — это упорядоченная последовательность элементов данных одного типа.

char name [40];

Квадратные скобки указывают, что переменная name — массив, 40 — число его элементов, a char задает тип каждого элемента.

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

/* похвала 1*/

#define PRAISE " Вот эта да, какое великолепное имя!"

main()

{

char name [50];

printf(" Как вас зовут?\n");

scanf(" %s", name);

printf(" Привет, %s. %s\n", name, PRAISE);

}

Как видите, нам не пришлось самим помещать нуль-символ в конец массива. Эта задача была выполнена за нас функцией scanf() при чтении вводимой строки. PRAISE — «символическая строковая константа».

Заметим (и это очень важно), что функция scanf() при вводе строки «Элмо Бланк» читает только имя Элмо. Дело в том, что, встретив какой-нибудь разделитель (пробел, символ табуляции или перевода строки), функция scanf() прекращает ввод символов, т. е. в данном случае она прекращает опрос переменной name в тот момент, когда доходит до пробела между «Элмо» и «Бланк». Вообще говоря, функция scanf() вводит только одиночные слова, а не целую фразу в качестве строки. Для чтения входной информации в языке Си имеются другие функции, например функция gets(), предназначенная для обработки строк общего вида.

Необходимо заметить также, что строка "х" не то же самое, что символ 'х'. Первое различие: 'x' — объект одного из основных типов (char), в то время как "х" — объект производного типа (массива элементов типа char). Второе различие: "х" на самом деле состоит из двух символов — символа 'х' и нуль-символа.

7.2. Длина строки — функция strlen().

Раньше мы практически без объяснений использовали операцию sizeof, которая дает нам размер объектов в байтах. Функция strlen() позволяет определять длину строки числом символов.

/* похвала 2*/

#define PRAISE " Вот это да, какое великолепное имя!"

main()

{

char name [50];

printf(" Как вас зовут?\n");

scanf(" %s", name);

printf(" Привет, %s. %s\n", name, PRAISE);

printf(" Ваше имя состоит из %d букв и занимает %d ячеек памяти. \n",

strlen (name), sizeof name);

printf(" Хвалебная фраза состоит из %d букв", strlen (PRAISE));

printf(" и занимает %d ячеек памяти. \n", sizeof PRAISE);

}

Заметим, что случайно мы воспользовались двумя методами для обработки длинных операторов printf(). В первом случае мы записали один оператор печати в двух строках программы (строкой программы считается строка до запятой).Мы сделали это, поскольку разрешается разбивать строку между аргументами, но не посередине строки. В другом случае использовались два оператора printf() для печати одной строки; мы указали символ «новая строка» (\ n) только во втором из них. Представленный ниже результат работы данной программы поможет понять подобную ситуацию:

Давайте посмотрим, в чем дело. Массив name занимает 50 ячеек памяти, и именно об этом сообщает операция sizeof. Но для хранения имени Перки требуются только первые пять ячеек, и как раз об этом нас информирует функция strlen(). В шестой ячейке массива name содержится нуль-символ, и его появление служит сигналом для функции strlen() прекратить подсчет символов.

Еще одно замечание: мы использовали операцию sizeof со скобками, а здесь — без них. Решение, использовать ли скобки или нет, зависит от того, что вы хотите знать: объем памяти, отводимый под элементы конкретного типа, или объем памяти, занимаемый определенным объектом. В первом случае вы писали бы sizeof(char) или sizeof(float), а во втором — sizeof name или sizeof 6.28.

7.3. Функции printf() и scanf().

Функции printf() и scanf() дают нам возможность взаимодействовать с программой. Мы называем их функциями ввода-вывода. Это не единственные функции, которыми мы можем воспользоваться для ввода и вывода данных с помощью программ на языке Си, но они наиболее универсальны. Указанные функции не входят в описание языка Си. И действительно, при работе с языком Си реализация функций ввода-вывода возлагается на создателей компилятора; это дает возможность более эффективно организовать ввод-вывод на конкретных машинах.





Дата публикования: 2015-01-13; Прочитано: 282 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...