Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Либерти Джесс. Освой самостоятельно С++ за 21 день. - royallib.ru.rtf
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2.55 Mб
Скачать

Использование функции cin.Ignore()

 В некоторых случаях возникает необходимость пропустить часть символов строки от начала до достижения конца строки (EOL) или конца файла (EOF). Именно этому и отвечает функция ignore(). Она принимает два параметра: число пропускаемых символов и символ разделения. Например, вызов функции ignore(80, '\n') приведет к пропуску 80 символов, если ранее не будет найден символ начала новой строки. Последний затем будет удален из буфера, после чего функция ignore() завершит свою работу. Использование функции ignore() показано в листинге 16.8.

Листинг 16.8. Использование функции ignore()

1: // Листинг 16.8. Использование ignore()

2: #include <iostream.h>

3:

4: int main()

5: {

6:    char string0ne[255];

7:    char stringTwo[255];

8:

9:    cout << "Enter string one:";

10:   cin.get(stringOne,255);

11:   cout << "String one: " << stringOne << endl;

12:  

13:   cout << "Enter string two: ";

14:   cin.getline(stringTwo,255);

15:   cout << "String two: " << stringTwo << endl;

16:

17:   cout << "\n\nNow try again...\n";

18:

19:   cin.ignore(255,'\n');

20:   cout << "Enter string two: ";

21:   cin.getline(stringTwo,255);

22:

23:   cout << "String Two: " << stringTwo<< endl;

24:

25:   cout << "Enter string one: ";

26:   cin.get(stringOne,255);

27:   cout << "String one: " << stringOne<< endl;

28:   return 0;

29: }

Результат:

Enter string one: once upon а time

String one: once upon а time

Enter string two:

String two:

Now try again...

Enter string one: once upon a time

String one: once upon a time

Enter string two: there was a

String Two: there was a

Анализ: В строках 6 и 7 создаются два массива символов. В строке 9 пользователю предлагается ввести строку. В нашем примере вводится строка once upon а time. Ввод завершается нажатием <Enter>. В строке 10 для считывания этой строки используется функция get(), которая присваивает эту строку переменной stringOne и останавливается на символе начала новой строки, оставляя его в буфере ввода.

В строке 13 пользователю еще раз предлагается ввести вторую строку, однако в этот раз функция getline() в строке 14 считывает символ разрыва строки, оставшийся в буфере, и сразу же завершает свою работу.

В строке 19 пользователю предлагается ввести первую строку. Однако в этом случае для пропуска символа разрыва строки используется функция ignore() (см. в листинге 16.8 строку 23). Таким образом, при вызове getline() строкой 26 буфер ввода пуст, и пользователь получает возможность ввести следующую строку.

Функции-члены peek() и putback()

Объект cin обладает двумя дополнительными методами, которые могут оказаться весьма полезными. Метод peek()просматривает, но не считывает очередной символ. Метод putback() вставляет символ в поток ввода. Использование этих методов показано в листинге 16.9.

Листинг 16.9. Использование функций peek() В putback()

1: // Листинг 16.9. Использование peek() и putback()

2: #include <iostream.h>

3:

4: int main()

5: {

6:    char ch;

7:    cout << "enter а phrase: ";

8:    while ( cin.get(ch) )

9:    {

10:      if (ch == '!' )

11:         cin.putback('$');

12:      else

13:         cout << ch;

14:      while (cin.peek() == '#')

15:         cin.ignore(1,'#');

16:   }

17:   return 0;

18: }

Результат:

enter а phrase: Now!is#the!time#for!fun#!

Now$isthe$timefor$fun$

Анализ: В строке 6 объявляется символьная переменная ch, а в строке 7 пользователю предлагается ввести строку текста. Назначение этой программы состоит в том, чтобы заменить все встречающиеся во введенной строке восклицательные знаки (!) знаком доллара ($) и удалить все символы (#).

Цикл while в теле функции main() программы прокручивается до тех пор, пока не будет возвращен символ конца файла (вводится комбинацией клавиш <Ctrl+C> в Windows или <Ctrl+Z> и <Ctrl+D> в MS DOS и UNIX соответственно). (Не забывайте, что функция cin.get() возвращает 0 в конце файла.) Если текущий символ оказывается восклицательным знаком, он отбрасывается, а в поток ввода функцией putback() возвращается символ $. Если же текущий символ не является восклицательным знаком, он выводится на экран. Если текущий символ оказывается #, то он пропускается функцией ignore().

Указанный подход далеко не самый эффективный способ решения подобных задач (более того, если символ # будет расположен в начале строки, то программа его пропустит). Но наша основная цель состояла в том, чтобы продемонстрировать работу функций putback() и ignore(). Впрочем, их использование достаточно просто и понятно.

Примечание: Методы peek() и putback() обычно используются для синтаксического анализа строк. Необходимость в нем возникает, например, при создании компилятора.