Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2014, 22:15   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

ну или так:

http://rextester.com/BQUZ13107

Код:
#include "iostream"
#include "string"

using namespace std;

int main()
{  
	int n; 
    //string temp; 
    size_t i=0;

	cin >> n; cout<< "number of n: "<< n <<endl;
    while(cin && i<3)
    {
        string temp; cin >> temp; 
        if(!temp.empty())
            cout << i<<") "<< temp <<endl, ++i;
    }
    
	cin >> n; cout<< "number of n: "<< n <<endl;        
	for (i=0; i < n; )
    {
        string temp;getline(cin,temp);
        if(!temp.empty())
            cout << i<<") "<< temp <<endl, ++i;
    }
    
   return 0;
}
проблема была в том, что если потоку что-то не понравится, он ничего не делает с переменной-получателем.

В коде ТС на каждой очередной итерации цикла строка temp не очищалась.
И если что-то пошло не так - содержала старое значение.

Так же, стоит учитывать, что оператор>> считает символом-разделителем "белые символы" (это пробел, окончание строки и тп)
Он забирает из потока как бы часть строки, а не всю целиком.

А getline считает символом-разделителем перевод строки или возврат корретки.
Она забирает всю строчку целиком от начала и до символов '\n' или '\r'.

Причем, после забора последней "живой" строки, в потоке ещё остается "пустая строка".
Нужно иметь это ввиду.

Поэтому у меня стоят проверки:

Код:
    while(cin && i<3)
    {
        string temp; cin >> temp; 
        if(!temp.empty())                                //<--- если пусто, значит это была последняя "пустая" строка потока
            cout << i<<") "<< temp <<endl, ++i;
    }

Последний раз редактировалось _Bers; 04.05.2014 в 22:25.
_Bers вне форума Ответить с цитированием
Старый 05.05.2014, 00:03   #12
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
бред

автор:
ты просишь считать int. вводишь число и жмешь enter. в поток записывается само число + возврат каретки и/или строки. далее, из потока считывается число, однако символ возврата каретки и/или строки в потоке остается. он считывается при первом вызове getline. И с точки зрения getline ты ввел пустую строку.

нужно очистить поток перед чтением твоих строк. например так:
Код:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
удалит из потока все до первого символа конца строки.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 05.05.2014, 00:23   #13
Cynically
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
бред

автор:
ты просишь считать int. вводишь число и жмешь enter. в поток записывается само число + возврат каретки и/или строки. далее, из потока считывается число, однако символ возврата каретки и/или строки в потоке остается. он считывается при первом вызове getline. И с точки зрения getline ты ввел пустую строку.

нужно очистить поток перед чтением твоих строк. например так:
Код:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
удалит из потока все до первого символа конца строки.
Проверю. Похоже на правду. И ошибка заковыристая, но тем и интересна. И думаю не только мне.


UPD: Проверил, огромное тебе человеческое спасибо, дружище!

Последний раз редактировалось Cynically; 05.05.2014 в 00:30.
Cynically вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual Studio Express 2012 Kris7 Помощь студентам 1 02.03.2015 19:27
Компиляция в Visual Studio 2012 Hellgate Помощь студентам 2 01.10.2013 12:09
Visual Studio 2010-2012 Генрюсай Visual C++ 0 29.05.2013 22:49
Visual Studio 2010-2012 Генрюсай C/C++ Базы данных 0 29.05.2013 22:48