Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Ввод-вывод строк




 

Для ввода-вывода строк используются как уже известные нам объекты cin и cout, так и функции, унаследованные из библиотеки С. Рассмотрим сначала первый способ:

 

#include <iostream.h> int main () { const int n = 80; char s[n]; cin >> s; cout << s << endl; return 0; }

 

Как видите, строка вводится точно так же, как и переменные известных нам типов. Запустите программу и введите строку, состоящую из одного слова. Запустите программу повторно и введите строку из нескольких слов. Во втором случае выводится только первое слово. Это связано с тем, что ввод выполняется до первого пробельного символа (то есть пробела, знака табуляции или символа перевода строки \n)1.

 

Можно ввести слова входной строки в отдельные строковые переменные:

 

#include <iostream.h> int main () { const int n = 80; char s[n], t[n], r[n]; cin >> s >> t >> r; cout << s << endl << t << endl << r « endl; return 0; }

Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используются методы getline или get класса istream, объектом которого является cin. Во второй части практикума мы изучим, что такое методы класса1, а пока можно пользоваться ими как волшебным заклинанием, не вдумываясь в смысл. Единственное, что нам пока нужно знать, это синтаксис вызова метода - после имени объекта ставится точка, а затем пишется имя метода:

 

#include <iostream.h> int main () { const int n = 80; char s[n]; cin.getline(s, n); cout << s << endl; cin.get(s. n); cout << s << endl; return 0; }

 

Метод getline считывает из входного потока n - 1 символов или менее (если символ перевода строки встретится раньше) и записывает их в строковую переменную s. Символ перевода строки2 также считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размещается завершающий 0. Если в строке исходных данных более n - 1 символов, следующий ввод будет выполняться из той же строки, начиная с первого несчитанного символа.

 

Метод get работает аналогично, но оставляет в потоке символ перевода строки. В строковую переменную добавляется завершающий 0.

 

Никогда не обращайтесь к разновидности метода get с двумя аргументами два раза подряд, не удалив \n из входного потока. Например:

 

cin.get(s. n); // 1 - считывание строки cout << s << endl; // 2 – вывод строки cin.get(s, n); // 3 – считывание строки cout << s << endl; // 4 – вывод строки cin.get(s, n); // 5 – считывание строки cout << s << endl; // 6 – вывод строки cout << "Конец - делу венец" << endl; // 7

 

При выполнении этого фрагмента вы увидите на экране первую строку, выведенную оператором 2, а затем завершающее сообщение, выведенное оператором 7. Какие бы прекрасные строки вы ни ввели с клавиатуры в надежде, что они будут прочитаны операторами 3 и 5, метод get в данном случае «уткнется» в символ \n. оставленный во входном потоке от первого вызова этого метода (оператор 1). В результате будут считаны и, соответственно, выведены на экран пустые строки (строки, содержащие 0 символов). А символ \n так и останется «торчать» во входном потоке. Возможное решение этой проблемы — удалить символ \n из входного потока путем вызова метода get без параметров, то есть после операторов 1 и 3 нужно вставить вызов cin.get().

 

Однако есть и более простое решение – использовать в таких случаях метода getline, который после прочтения строки не оставляет во входном потоке символ \n.

 

Если в программе требуется ввести несколько строк, метод getline удобно использовать в заголовке цикла, например:

 

#include <iostream.h> int main () { const int n = 80; char s[n]; while (cin.getline(s,n)) { cout << s << endl; ... // обработка строки } return 0; }

 

Рассмотрим теперь способы ввода-вывода строк, перекочевавшие в C++ из языка С. Во-первых, можно использовать для ввода строки известную нам функцию scanf, а для вывода - рrintf, задав спецификацию формата %s:

 

#include <stdio.h> int main () { const int n = 80; char s[n]; scanf("%s", s); printf ("%s", s); return 0; }

 

Имя строки, как и любого массива, является указателем на его начало, поэтому использовавшаяся в предыдущих примерах применения функции scanf операция взятия адреса (&) опущена. Ввод будет выполняться так же, как и для классов ввода-вывода — до первого пробельного символа. Чтобы ввести строку, состоящую из нескольких слов, используется спецификация (символы) с указанием максимального количества вводимых символов, например:

 

scanf("%10c", s);

 

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

 

 

pr1ntf("%15s", s);

 

 

Строка при этом выравнивается по правому краю отведенного поля. Если заданное количество позиций недостаточно для размещения строки, оно игнорируется, и строка выводится целиком. Спецификации формата описаны в Учебнике на с.387, а сами функции семейства printf — на с. 411 и далее.

 

Библиотека содержит также функции, специально предназначенные для ввода-вывода строк: gets и puts. Предыдущий пример с использованием я выглядит так:

 

 

#include <stdio.h> int main () { const int n = 10; char s[n]; gets(s); puts(s); return 0; }

 

Функция gets(s) читает символы с клавиатуры до появления символа новой строки и помещает их в строку s (сам символ новой строки в строку не включается. вместо него в строку заносится нуль-символ). Функция возвращает указатель на строку s, а в случае возникновения ошибки или конца файла — NULL.

Функция puts(s) выводит строку s на стандартное устройство вывода, заменяя завершающий 0 символом новой строки. Возвращает неотрицательное значение при успехе или EOF при ошибке.

 

Функциями семейства printf удобнее пользоваться в том случае, если в одном операторе требуется ввести или вывести данные различных типов. Если же работа выполняется только со строками, проще применять специальные функции для ввода-вывода строк gets и puts.

 







Дата добавления: 2014-11-10; просмотров: 167. Нарушение авторских прав

Studopedia.info - Студопедия - 2014-2018 год . (0.002 сек.) русская версия | украинская версия