оператор перегрузки ›› для строкового класса c++

У меня проблема с перегрузкой оператора >> для строкового класса; вот мой класс:

class str
{
    char s[250];
    public:
    friend istream& operator >> (istream& is, str& a);
    friend ostream& operator << (ostream& os, str& a);
    friend str operator + (str a, str b);
    str * operator = (str a);
    friend int operator == (str a, str b);
    friend int operator != (str a, str b);
    friend int operator > (str a, str b);
    friend int operator < (str a, str b);
    friend int operator >= (str a, str b);
    friend int operator <= (str a, str b);
};

а вот перегруженный оператор:

istream& operator >> (istream& in, str& a)
{
    in>>a.s;
    return in;
}

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

Я решил это. Нашел ответ на dreamincode :D


person Kira - The God    schedule 03.10.2012    source источник
comment
Re: проблема в том, что он читает строку только до первого пробела: тогда как вы хотите, чтобы она читалась полностью до . . . какие? (Другими словами: непонятно, что вы пытаетесь сделать, поэтому мы не можем вам помочь.)   -  person ruakh    schedule 03.10.2012
comment
например: я хочу прочитать Это Спарта, он читает только Это   -  person Kira - The God    schedule 03.10.2012
comment
@MihaiSvet, вопрос ruakh был о том, как вы ожидаете, что он узнает, что этого достаточно.   -  person Michael Krelin - hacker    schedule 03.10.2012
comment
Взгляните на эту ссылку dreamincode.net /форумы/тема/   -  person tranceporter    schedule 03.10.2012
comment
Разве не так работает istream >>?   -  person slugonamission    schedule 03.10.2012
comment
@Wug - так и думал, спасибо за подтверждение.   -  person slugonamission    schedule 03.10.2012


Ответы (3)


Поведение для operator>> заключается в чтении до первого символа пробела. Измените свою функцию на следующую:

istream& operator >> (istream& in, str& a)
{
    in.getline( a.s, sizeof(a.s) );
    return in;
}
person Praetorian    schedule 03.10.2012

Перегруженный оператор>>() для класса istream просто принимает ввод до тех пор, пока не найдет пробел (табуляция, новая строка, символы пробела). Вам нужно использовать метод getline.

...
istream& operator >> (istream& in, str& a)
{
    in.getline(a.s, 250);
    return in;
}
...
person Kurospidey    schedule 03.10.2012

Вот как это работает, вы, вероятно, захотите использовать std::getline(std::istream&,std: :string&) из std::getline(std::istream&,std::string&,char).

редактировать: другие, предполагающие getline istream, также правы.

person Michael Krelin - hacker    schedule 03.10.2012