Модераторы: Daevaorn
   

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> string 
V
    Опции темы
ZufuS
Дата 8.12.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Надо ввести строки с учётом пробелов. Использую getline(). Но если перед вызовом этой функции что-то вводится, получается не то, что задумано.
Код

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int i;
    string str1, str2;

    cout << "i=";
    cin >> i;

    cout << "str1=";
    getline(cin, str1);

    cout << "str2=";
    getline(cin, str1);

    return 0;
}

после ввода i появляется str1=str2=

Это сообщение отредактировал(а) ZufuS - 8.12.2007, 22:51
PM   Вверх
JackYF
Дата 9.12.2007, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(ZufuS @  8.12.2007,  22:51 Найти цитируемый пост)
после ввода i появляется str1=str2=

Наверное, буферизация. После cout << делай

Код

cout.flush();



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



JackYF, совет правильный, но после ввода i появиться этого не может smile.
ZufuS, а ты после ввода i enter один раз нажимаешь?

Добавлено через 41 секунду
Кстати:
Код

    cout << "str2=";
    getline(cin, str2);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
ZufuS
Дата 9.12.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(JackYF @  9.12.2007,  03:01 Найти цитируемый пост)
cout.flush();

Не помогает. Куда это написать надо?
Цитата(archimed7592 @  9.12.2007,  09:36 Найти цитируемый пост)
а ты после ввода i enter один раз нажимаешь?

естественно
PM   Вверх
archimed7592
Дата 9.12.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(ZufuS @  9.12.2007,  12:59 Найти цитируемый пост)
Куда это написать надо?

Сразу после каждого cout << ...


Цитата(ZufuS @  9.12.2007,  12:59 Найти цитируемый пост)
естественно

Вообще говоря, ничего естественного в таком поведении нет.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
ZufuS
Дата 9.12.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Код

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int i;
    string str1, str2;

    cout << "i=";
    cout.flush();
    cin >> i;

    cout << "str1=";
    cout.flush();
    getline(cin, str1);

    cout << "str2=";
    cout.flush();
    getline(cin, str1);

    return 0;

}

так? не помогает.
PM   Вверх
archimed7592
Дата 9.12.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Эммм... Я, если честно, сижу сейчас в шоке. У меня оно работает точно так же smile. Сейчас попробую разобраться почему, ибо жутко интересно, как такое возможно smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



ZufuS, первый getline считывает '\n', думая, что это и есть первый ввод. Надобно тогда пропустить это:
Код

cin.ignore(1);

Перед первым getline.


Это сообщение отредактировал(а) JackYF - 9.12.2007, 14:23


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Ага, всё понятно - всё что ты вводишь после числа i - будь то пробелы или перевод строки будет восприниматься как str1. Т.к. getline читает до первого перевода строки, ты получаешь в результате str1 равное пустой строке. Т.е. нужно добавить вот это:
Код

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int i;
    string str1, str2;
    cout << "i=";
    cout.flush();
    cin >> i;
    cout << "str1=";
    cout.flush();
    if (cin.peek() == '\n')
     cin.ignore();

    getline(cin, str1);
    cout << "str2=";
    cout.flush();
    getline(cin, str2);
    return 0;
}


Ещё раз обращаю внимание на то, что у тебя в 3-ей строке снизу было str1 вместо str2.

Добавлено через 3 минуты и 14 секунд
JackYF, что ж ты раньше молчал? Меня чуть кондратий не хватил, когда я увидел на экране описываемое поведение smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  9.12.2007,  14:28 Найти цитируемый пост)
JackYF, что ж ты раньше молчал? Меня чуть кондратий не хватил, когда я увидел на экране описываемое поведение

 smile да я уже давно таким не занимался, вот и забыл, потом проверил на всякий случай smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ZufuS
Дата 9.12.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



заработало, спасибо
PM   Вверх
bsa
Дата 9.12.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



ZufuS, пометь тему решенной

PM   Вверх
zkv
Дата 10.12.2007, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



вообщем-то грабли старые как мир, решить можно _flushall() :
Код

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int i;
    string str1, str2;
    cout << "i=";
    
    cin >> i;
    _flushall();
    cout << "str1=";

    getline(cin, str1);
    cout << "str2=";

    getline(cin, str2);

    return 0;
}

но вероятно это не лучший выход.

У Xenon'a подглядел более вменяемое решение проблемы через basic_istream::sync():
Код

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int i;
    string str1, str2;
    cout << "i=";
    
    cin >> i;
    cin.sync();
    cout << "str1=";

    getline(cin, str1);
    cout << "str2=";

    getline(cin, str2);

    return 0;
}

PM MAIL   Вверх
JackYF
Дата 10.12.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(zkv @  10.12.2007,  02:36 Найти цитируемый пост)
У Xenon'a подглядел более вменяемое решение проблемы через basic_istream::sync():

а вот это не пашет, я проверял. Вернее так: пашет не всегда.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
   
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0767 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.