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

Неправильно работает перегруженный оператор - C++

Восстановить пароль Регистрация
 
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
23.01.2013, 13:34     Неправильно работает перегруженный оператор #1
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
#include <iostream>
using namespace std;
class PhoneNumber
{
    friend ostream &operator << (ostream &, const PhoneNumber &);
    friend istream &operator >> (istream &, PhoneNumber &);
private:
    char areacode[4];
    char exchange[4];
    char line[5];
};
ostream &operator <<(ostream & output, const PhoneNumber & num)
{
    output << "(" << num.areacode << ") " << num.exchange << "-" << num.line;
    return output;
}
istream &operator >>(istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areacode,4);
    input.ignore(2);
    input.getline(num.exchange, 4);
    input.ignore();
    input.getline(num.line,5);
    return input;
}
int main()
{
    PhoneNumber phone;
    cout << "input number int the format (123) 456-7890:";
    cin >> phone;
    cout << endl << "Number was input: " << phone << endl;
 
    system("pause");
    return 0;
}
в 32 строке должен вводиться номер телефона вывод работает правильно проверял, а ввод правильно работает только для первых трех цифр, в скобках...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2013, 13:34     Неправильно работает перегруженный оператор
Посмотрите здесь:

Неправильно работает оператор fabs() C++
C++ перегруженный оператор <<
C++ перегруженный оператор вывода
Перегруженный оператор присваивания C++
C++ почему не работает перегруженный оператор?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
23.01.2013, 14:05     Неправильно работает перегруженный оператор #2
Неправильно работает из-за того, что трижды используется 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 <string>
using namespace std;
class PhoneNumber
{
    friend ostream &operator << (ostream &, const PhoneNumber &);
    friend istream &operator >> (istream &, PhoneNumber &);
private:
//    char areacode[4];
//    char exchange[4];
//    char line[5];
    string areacode, exchange, line;
 
};
ostream &operator <<(ostream & output, const PhoneNumber & num)
{
    output << "(" << num.areacode << ") " << num.exchange << "-" << num.line;
    return output;
}
istream &operator >>(istream &input, PhoneNumber &num)
{
    string temp;
    input.ignore();
    getline(input,temp);
    num.areacode=temp.substr(0,3);
    num.exchange=temp.substr(5,3);
    num.line=temp.substr(9,4);
    return input;
}
int main()
{
    PhoneNumber phone;
    cout << "input number int the format (123) 456-7890:"<<endl;
    cin >> phone;
    cout << endl << "Number was input: " << phone << endl;
 
    //system("pause");
    return 0;
}
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
23.01.2013, 14:17  [ТС]     Неправильно работает перегруженный оператор #3
А есть разница input.getline() и getline()
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
23.01.2013, 14:24     Неправильно работает перегруженный оператор #4
istream::getline - член класса istream, a std::getline - глобальная функция. std::getline в качестве аргументов принимает поток и строку, istream::getline - строку, максимальное количество символов и символ разделитель.
Можете почитать подробнее:
http://www.cplusplus.com/reference/i...tream/getline/
http://www.cplusplus.com/reference/s...tring/getline/
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
23.01.2013, 14:26  [ТС]     Неправильно работает перегруженный оператор #5
и можно как то без string?
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
23.01.2013, 14:33     Неправильно работает перегруженный оператор #6
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
40
41
42
43
#include <iostream>
#include <string.h>
 
using namespace std;
class PhoneNumber
{
    friend ostream &operator << (ostream &, const PhoneNumber &);
    friend istream &operator >> (istream &, PhoneNumber &);
private:
    char areacode[4];
    char exchange[4];
    char line[5];
    //string areacode, exchange, line;
 
};
ostream &operator <<(ostream & output, const PhoneNumber & num)
{
    output << "(" << num.areacode << ") " << num.exchange << "-" << num.line;
    return output;
}
istream &operator >>(istream &input, PhoneNumber &num)
{
    char temp[100];
    input.ignore();
    input.getline(temp,20);
    strncpy(num.areacode,temp,3);
    num.areacode[3]='\0';
    strncpy(num.exchange,temp+5,3);
    num.exchange[3]='\0';
    strncpy(num.line,temp+9,4);
    num.line[4]='\0';
    return input;
}
int main()
{
    PhoneNumber phone;
    cout << "input number int the format (123) 456-7890:"<<endl;
    cin >> phone;
    cout << endl << "Number was input: " << phone << endl;
 
    //system("pause");
    return 0;
}
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
23.01.2013, 14:34  [ТС]     Неправильно работает перегруженный оператор #7
Ваш код у меня не компилируется)
(который со стрингом)
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
23.01.2013, 14:37     Неправильно работает перегруженный оператор #8
Какой компилятор, какая ошибка? На g++ 4.7 все чудесно работает.

Добавлено через 1 минуту
На Microsoft Visual Studio 2010 тоже
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
23.01.2013, 14:45  [ТС]     Неправильно работает перегруженный оператор #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream &operator >>(istream &input, PhoneNumber &num)
{
    char temp[100];
    input.ignore();
    input.getline(temp,20);
    strncpy(num.areacode,temp,3);
    num.areacode[3]='\0';
    strncpy(num.exchange,temp+5,3);
    num.exchange[3]='\0';
    strncpy(num.line,temp+9,4);
    num.line[4]='\0';
    return input;
}
этот код работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2013, 14:47     Неправильно работает перегруженный оператор
Еще ссылки по теме:

C++ Перегруженный оператор
C++ Слишком медленно работает перегруженный оператор
C++ Перегруженный "оператор +" неправильно возвращает значения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
23.01.2013, 14:47     Неправильно работает перегруженный оператор #10
C++
1
input.getline(num.areacode, size);
Если вводится больше, чем size-1, то для потока input устанавливает failbit. Поэтому нужно очистить флаги состояния:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
istream &operator >>(istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areacode,4);
    
    input.clear();
    input.ignore(2);
    input.getline(num.exchange, 4);
    
    input.clear();
    input.ignore();
    input.getline(num.line,5);
    
    return input;
}
Или использовать метод get, он в этом случае не устанавливает failbit:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream &operator >>(istream &input, PhoneNumber &num)
{
    input.ignore();
    input.get(num.areacode,4);
    
    input.ignore(2);
    input.get(num.exchange, 4);
    
    input.ignore();
    input.get(num.line,5);
    
    return input;
}
Yandex
Объявления
23.01.2013, 14:47     Неправильно работает перегруженный оператор
Ответ Создать тему
Опции темы

Текущее время: 19:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru