Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для AmbA
495 / 24 / 6
Регистрация: 09.06.2017
Сообщений: 322
Записей в блоге: 19

Зачем здесь символ новой строки?

05.07.2017, 07:16. Показов 1595. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стивен Прата, Язык программирования С++, глава 7, пример 7
Никак не пойму, зачем здесь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double temp;
    int i;
    for(i=0; i<limit; i++)
    {
        std::cout << "enter value #" << i + 1 << ":";
        std::cin >> temp;
        if(!std::cin)
        {
            std::cin.clear();
            while(std::cin.get() != '\n')
                continue;
            std::cout << "bad input, input process terminated.\n";
            break;
        }
        else if (temp <0)
            break;
        ar[i] = temp;
    }
мы ищем новую строку:
C++
1
2
while(std::cin.get() != '\n')
    continue;
?? Об общем смысле я догадываюсь - проверка корректности ввода, мне непонятно, при чём тут новая строка...

На всякий случай весь код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// функции, работающие с массивами, и применение const
#include <iostream>
const int Max = 5;
 
int fill_array(double ar[], int limit);
void show_array(const double ar[], int n);
void revalue(double r, double ar[], int n);
int main()
{
    double prop[Max];
    int size = fill_array(prop, Max);
    show_array(prop, size);
    if(size > 0)
    {
        std::cout << "Enter reval factor: ";
        double factor;
        while(!(std::cin >> factor))
        {
            std::cin.clear();
            while (std::cin.get() != '\n')          
                continue;
            std::cout << "Bad input. Enter a number.";          
        }
        revalue(factor, prop, size);
        show_array(prop, size);
    }
    std::cout << "end" << std::endl;
    return 0;
}
int fill_array(double ar[], int limit)
{
    double temp;
    int i;
    for(i=0; i<limit; i++)
    {
        std::cout << "enter value #" << i + 1 << ":";
        std::cin >> temp;
        if(!std::cin)
        {
            std::cin.clear();
            while(std::cin.get() != '\n')
                continue;
            std::cout << "bad input, input process terminated.\n";
            break;
        }
        else if (temp <0)
            break;
        ar[i] = temp;
    }
    return i;
}
void show_array(const double ar[], int n)
{
    for (int i = 0; i < n; i++)
        std::cout << "Prop #" << i + 1 << ": $" << ar[i] << std::endl;
}
void revalue(double r, double ar[], int n)
{
    for (int i = 0; i < n; i++)
        ar[i] *= r;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2017, 07:16
Ответы с готовыми решениями:

Символ новой строки
Всем привет) С маппировал текстовый файл в память. HANDLE file = CreateFile(fileNameWChar, GENERIC_READ | GENERIC_WRITE, 0, NULL,...

Символ новой строки в MFC
При работе в MFC нужно вести протокол работы, то есть, сделали операцию a + b = c, записали в окно и т.д. Я создал Edit Control, с...

Std::cin, символ новой строки
Подскажите, куда в данном примере после каждого cin'а девается символ новой строки? Насколько помню cin и cin.get его после себя оставляют...

6
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.07.2017, 07:23
Распространенные ошибки

Добавлено через 2 минуты
остаеться символ в потоке "\n"
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
05.07.2017, 07:31
Цитата Сообщение от AmbA Посмотреть сообщение
мне непонятно, при чём тут новая строка...
Речь идет о работе с обычным построчным вводом. Каждая строка заканчивается символом '\n'.

Если ввод std::cin >> temp; оказался неуспешным, т.е. то код полагает, что все, что содержится в этой строке до самого ее конца является "мусором". Мы хотим пропустить этот "мусор", т.е. пропустить остаток этой строки. Вот это и делает данный цикл: читает и отбрасывает все символы из входного потока пока не прочитает '\n'.

При использовании клавиатурного ввода '\n' - это ни что иное, как нажатие клавиши <Enter> пользователем. Т.е. в случае клавиатурного ввода, при возникновении ошибки чтения данный цикл просто пропускает все, что пользователь ввел до нажатия клавиши <Enter>.

Добавлено через 7 минут
Цитата Сообщение от Antikl Посмотреть сообщение
Распространенные ошибки
остаеться символ в потоке "\n"
Это несколько "мимо кассы". Рассматриваемый цикл вызывается только в том случае, если произошла ошибка чтения. Если ошибки чтения не произошло, то код ничего такого не делает. При этом во входном буфере остается эта самая '\n', но данный код этого совершенно не боится. При использовании чисто форматированного ввода, как в данном случае, проблемы "остающегося в потоке '\n'" обычно не возникает вообще и бороться с ней незачем.

В данном случае речь идет не о борьбе с "остающегося в потоке '\n'", а именно о чистке входного буфера после возникновения ошибки.
1
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.07.2017, 07:40
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"остающегося в потоке '\n'"
перейдите по ссылке найдите там в теме Оставление символа '\n' в потоке ввода там написанно про это
C++
1
2
while(std::cin.get() != '\n')
    continue;
Добавлено через 4 минуты
лучше это использовать
C++
1
(cin >> n).get();
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
05.07.2017, 07:46
Цитата Сообщение от Antikl Посмотреть сообщение
перейдите по ссылке найдите там в теме Оставление символа '\n' в потоке ввода там написанно про это
Это прекрасно. В обоих случаях этот цикл решет одну и ту же задачу - отбрасывает содержимое входного буфера до конца строки. С этим никто не спорит.

Но цели этого отбрасывания - совершенно разные. По вашей ссылке на "Распространенные ошибки" не идет никакой речи о чистке буфера после ошибок ввода. По вашей ссылке речь идет о проблеме "остающегося в потоке '\n'", которая возникает при смешивании форматированного и неформатированного чтения данных из потока. К ошибкам ввода эта тема никакого отношения не имеет.

В этом же случае речь идет о чистке буфера именно после возникновения ошибок ввода.

Т.е. средства используются похожие, но причины применения этих средств - совершенно разные.

Цитата Сообщение от Antikl Посмотреть сообщение
лучше это использовать
C++
1
(cin >> n).get();
Вот именно (!) что в рамках данной темы это совершенно не нужно, совершенно бесполезно и абсолютно ничего не даст.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.07.2017, 07:47
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
но причины применения этих средств - совершенно разные
согласен
0
 Аватар для AmbA
495 / 24 / 6
Регистрация: 09.06.2017
Сообщений: 322
Записей в блоге: 19
05.07.2017, 07:50  [ТС]
Ага. А новая строка во вводе зачем нужна? Вот мы сбросили ошибки cin.clear(); , проглотили по одному символы с помощью цикла, и оставили в вводе \n

Понял!!! Цикл не оставляет в вводе \n! Он его прочитывает, и на этом останавливается!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2017, 07:50
Помогаю со студенческими работами здесь

Ошибка: символ новой строки в потоке
После того как указываю 1 пункт (к-ство квартир),то мне выбивает сразу 2 и 3,а не поочередно,подскажите где я ошибся? #include...

Отбрасывает ли std::cin символ новой строки?
Здравствуйте. Есть следующий код (это задача из книги Праты): #include &lt;iostream&gt; const unsigned short strsize = 100; struct sBop ...

Как убрать символ новой строки, применяя перегруженный оператор <<?
Друзья! Ну то есть формируются строки хитрым способом (не вручную, лучше не углубляться в это) Потом получаю вектор этих строк. Надо...

Будет ли добавлен символ новой строки при ошибочном вводе?
После того, как пользователь введет число и нажмеn enter в поток будет передан символ новой строки '\n'. Будет ли добавлен символ новой...

Ввести символьную строку. Распечатать каждый символ массива с новой строки
Ввести символьную строку. Распечатать каждый символ массива с новой строки.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru