Форум программистов, компьютерный форум CyberForum.ru

"Проскакивает" getline(), если ранее вводилась целочисленная переменная. Почему? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Получение данных о пк http://www.cyberforum.ru/cpp-beginners/thread261275.html
какие функций существуют или как это сделать? например узнать какой процессор и какое на нем сейчас напряжение?)
C++ Вычислить суммы положительных элементов в каждой строке двумерного массива Вычислить суммы положительных элементов в каждой строке двумерного массива в С++ Builder 6.0 http://www.cyberforum.ru/cpp-beginners/thread261270.html
C++ Файлы. Динамические массивы.
Вывести на экран элементы входной последовательности положительных целых чисел, встречающихся в ней не более одного раза. Входная последовательность сохраняется в файле "lab1.dat"в виде: <элемент 1> <элемент 2> ... -1 Не разбираюсь в файлах!! Помогите реализовать!
матрица C++
В заданной целочисленной матрице найти количество ее столбцов, элементы которых упорядочены по убыванию. Помогите пожалуйста, я не могу написать это всё на СИ
C++ ошибка при работе с двунаправлеными списками http://www.cyberforum.ru/cpp-beginners/thread261263.html
//помогите исправить пожалуйста. отладчик пишет <Bad Ptr> при объявлении указателя на голову списка int main () { int q; printf ("q\n"); scanf ("%d", & q); list * head = Add (NULL); for (list *p = head; q>= 1;q--) fill_list (head); ...
C++ Функции. Перегрузка функций Используя механизм перегрузки функций, разработайте две версии функции F, заголовки которых выглядят следующим образом: 1)float F ( float x ); 2)void F (float x, float &y); Продемонстрируйте работу данных функций на примере: y = 0, если 5 < x < 20; y= x^2 +5, если x<=5; y = 1, если x>= 20; Очень прошу друзья, сделайте задачу, уделите несколько минут своего времени! подробнее

Показать сообщение отдельно
Роман К.
3 / 3 / 0
Регистрация: 08.11.2010
Сообщений: 6
21.03.2011, 17:11     "Проскакивает" getline(), если ранее вводилась целочисленная переменная. Почему?
Итак... Имеется кусок кода, который должен принимать с клавиатуры порядковый номер работы (целое число), её название (строка) и описание (опять-таки, строка). Учитывая, что "название" и "описание" будут содержать в себе знаки препинания, решил использовать getline().

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
#include <iostream>
#include <stdio.h>
#include <string>
 
using namespace std;
 
 
int nrabota;
string s1 = " название";
string s2 = " описание";
 
 
int main()
{
    cout << "Hello world!" << endl;
 
 
//Начало целочисленного ввода
    cout << "\n\nУказываем порядковый номер работы \n";   //Порядковый номер работы
    cin >> nrabota; //Порядковый номер работы, присваиваем значение переменной
    cout << "Вы ввели номер работы " << nrabota << "\n\n";    //Результат для проверки, потом выпиливаем
//Конец целочисленного ввода
 
 
//Начало строкового ввода
    cout << "Вводим название работы\n";
    getline(cin, s1);
    cout << "Вы ввели\t" << s1 << "\n";
 
    cout << "\nВводим описание\n";
    getline(cin, s2);
    cout << "Вы ввели\t" << s2 << "\n";
//Конец строкового ввода
 
    cout << nrabota << ". " << "[b]" << s1 << "[/b] " << "\n" << s2 << "\n";    //Вывод результата
 
 
    return 0;
}
Казалось бы, всё нормально и ошибиться негде, но при выполнении возникает досадный глюк. getline(), следующий за целочисленным вводом, "проскакивает": то есть, курсор не останавливается, и программа ввода с клавиатуры не ждёт. Переменная при этом принимает значение "пустоты" - умолчание, заданное при объявлении, стирается. Второй getline(), который "описание", в данном случае, работает нормально.

Если переместить ввод целого значения ("номер работы") в конец кода, то обе строки будут приняты без нареканий.

Теоретически, идеи "костылей" очевидны: можно всобачить между целочисленным и строковым вводом ещё один, заведомо ненужный, строковой ввод, который и будет зануляться; можно попробовать вывести строковые вводы в отдельную функцию (не пробовал, но, насколько я понимаю ситуацию, может помочь). Однако,

хотелось бы разобраться, из-за чего происходит описанный глюк и как его исправить корректно, а не индусятническтвом.


P.S. Прошу прощения, если ответ уже где-то существует на этом форуме. Я не смог придумать, как сформулировать адекватный поисковый запрос для моей проблемы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 18:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru