Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > string


Автор: ZufuS 8.12.2007, 22:51
Надо ввести строки с учётом пробелов. Использую 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=

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

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

Код

cout.flush();

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

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

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

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

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

естественно

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

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


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

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

Автор: ZufuS 9.12.2007, 13:27
Код

#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;

}

так? не помогает.

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

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

cin.ignore(1);

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

Автор: archimed7592 9.12.2007, 14:28
Ага, всё понятно - всё что ты вводишь после числа 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.

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

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

Автор: ZufuS 9.12.2007, 16:31
заработало, спасибо

Автор: bsa 9.12.2007, 16:33
ZufuS, пометь тему решенной

Автор: zkv 10.12.2007, 02:36
вообщем-то грабли старые как мир, решить можно _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;
}

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)