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

Ошибка в листинге в книге - C++

Восстановить пароль Регистрация
 
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
25.03.2013, 17:32     Ошибка в листинге в книге #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
#ifndef STRING1_H_
#define STRING1_H_
#include <iostream>
class String {
    private:
                char    *   str;
                int         len;
        static  int         num_strings;
        //ââîä ГЈГ°Г*Г*èöû cin
        static  const   int         CINLIM      = 80;
    public:
        //ГЄГ®Г*ñòðóêòîðû ГЁ äðóãèå ìåòîäû
                String                  (const char *);
                String                  ();
                String                  (const String &);
                ~String                 ();
                int         lenght      () const    {return len;};
        //ïåðåãðóæåГ*Г*ûå ìåòîäû îïåðГ*òîðГ*
                String  &   operator=   (const String  &);
                String  &   operator=   (const char *);
                char    &   operator[]  (int);
        const   char    &   operator[]  (int)       const;
        //ïåðåãðóæåГ*Г*ûå äðóæåñòâåГ*Г*ûå îïåðГ*òîðû
        friend  bool                operator<   (const String &,       const String &);
        friend  bool                operator>   (const String &,       const String &);
        friend  bool                operator==  (const String &,       const String &);
        friend  std::ostream    &   operator<<  (std::ostream &, const String &);
        friend  std::istream    &   operator>>  (std::istream &,       String &);
        //friend bool strcpm (const char * n, const char * m);
        //Г±ГІГ*ГІГЁГ·ГҐГ±ГЄГЁГҐ ГґГіГ*êöèè
        static  int HowMany ();
};
#endif


Кликните здесь для просмотра всего текста
методы
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <cstring>
#include "string1.h"
//ГЁГ*èöèГ*ëèçГ*öèÿ Г±ГІГ*òè÷åñêîãî ýëåìåГ*ГІГ*
int String  ::  num_strings = 0;
int String  ::  HowMany     ()  {
    return num_strings;
};
// ìåòîäû ГЄГ«Г*Г±Г±Г*
String :: String (const char * s) { //ñîçäГ*Г*ГЁГҐ îáúåêòГ* String ГЁГ§ ñòðîêè
    len = strlen (s);   //ГіГ±ГІГ*Г*îâêГ* Г°Г*çìåðГ*
    str = new char [len +1];    //Г°Г*çïðåäåëåГ*ГЁГҐ ГЇГ*ìÿòè
    strcpy  (str, s);           //ГЁГ*èöèГ*ëèçГ*öèÿ ГіГЄГ*Г§Г*òåëÿ
    num_strings++;          //ГіГ±ГІГ*Г*îâêГ* Г±Г·ГҐГІГ·ГЁГЄГ* îáúåêòГ*
};
String :: String () {       //ГЄГ®Г*ñòðóêòîð ГЇГ® óìîë÷Г*Г*ГЁГѕ
    len = 1;
    str = new char [1];
    str [0] = '\0';     //ñòðîêГ* ГЇГ® óìîë÷Г*Г*ГЁГѕ
    num_strings++;
};
String :: String (const String & st) {
    num_strings++;
    delete [] str;
    len = st.len;
    str = new char [len + 1];
    strcpy (str, st.str);       //êîïèðîâГ*Г*ГЁГҐ ñòðîêè Гў Г*îâîå ìåñòî
};
String :: ~String () {          //Г*åîáõîäèìûé äåñòðóêòîð
    --num_strings;           //Г*åîáõîäèìî
    delete [] str;          //Г*åîáõîäèìî
};
//ïåðåãðóæåГ*Г*ûå ìåòîäû îïåðГ*òîðГ*
//ïðèñâГ*ГЁГўГ*Г*ГЁГҐ îáúåêòГ* string îáúåêòó string
String & String :: operator= (const String &  st) {
    if (this == &st)
        return *this;
    delete [] str;
    len = st.len;
    str = new char [len + 1];
    strcpy (str, st.str);
    return *this;
};
//ïðèñâГ*ГЁГўГ*Г*ГЁГҐ ñòðîêè îáúåêòó string
String & String :: operator= (const char * s){
    delete [] str;
    len = strlen (s);
    str = new char [len + 1];
    strcpy (str, s);
    return *this;
};
//äîñòóï Г·ГІГҐГ*ГЁГї-Г§Г*ГЇГЁГ±ГЁ char äëÿ îáúåêòГ* Г*ГҐ-const  String
char & String :: operator[] (int i) {
    return str [i];
};
//äîñòóï Г·ГІГҐГ*ГЁГї char äëÿ îáúåêòГ* string
const char & String :: operator[] (int i) const {
    return str [i];
};
//ïåðåãðóæåГ*Г*ûå äðóæåñòâåГ*Г*ûå îïåðГ*òîðû
bool operator< (const String & st1, const String & st2) {
    return (strcmp  (st1.str, st2.str) < 0);
};
bool operator> (const String & st1, const String & st2) {
    return (st2.str < st1.str);
};
bool operator== (const String & st1, const String & st2) {
    return (strcmp  (st1.str, st2.str) > 0);
};
//âûâîä String
std::ostream & operator<< (std::ostream & os, const String & st) {
    os << st.str;
    return os;
};
//áûñòðûé ââîä String/
std::istream & operator>> (std::istream & is,  String & st) {
    char temp [String::CINLIM];
    is.get (temp, String::CINLIM);
    if (is)
        st = temp;
    while (is && is.get () != '\n')
        continue;
    return is;
};

мэин
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
#include "string1.h"
const int ArSize = 10;
const int  MaxLen  = 81;
int main () {
    using std :: cout;
    using std :: cin;
    String name;
    cout << "Hi, what's your name?\n";
    cin >> name;
    cout << name << ", please enter up to " << ArSize
        << " short sayings <enter empty line to quite>:\n";
        String sayings [ArSize];    //Г¬Г*Г±Г±ГЁГў îáúåêòîâ
        char temp [MaxLen];     //âðåìåГ*Г*îå õðГ*Г*èëèùå
        int i;
        for (i = 0; i < ArSize; i++) {
            cout << i+1 << ": ";
            cin.get (temp, MaxLen);
            while (cin && cin.get () != '\n')     //ошибка скорей всего здесь
                continue;
            if (!cin || temp [0] == '\0')   //ГЇГіГ±ГІГ*Гї ñòðîêГ*?
                break;                  //i Г*ГҐ èìååò ïðèðГ*Г№ГҐГ*ГЁГї
            else    
                sayings [i] = 0;    //ïåðåãðóæГ*åìîå ïðèñâГ*ГЁГўГ*Г*ГЁГҐ
            };
        int total = i;
        cout << "Here are your sayings:\n";
        for (i = 0; i < total; i++)
            cout << sayings [i] << "\n";
         int shortest = 0;
         int first = 0;
         for (i = 0; i < total; i++) {
                if (sayings [i].lenght ()  < sayings [shortest].lenght())
                    shortest = i;
                if (sayings [i] < sayings [first])
                    first = i;
        };
        cout << "Shortest saying:\n" << sayings [shortest] << "\n";
        cout << "First alphabetically:\n" << sayings [first] << "\n";
        cout << "This program used " << String::HowMany () << " String objects. Bye.\n";
        return 0;
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2013, 17:32     Ошибка в листинге в книге
Посмотрите здесь:

Помогите разобраться в готовом листинге... C++
какая то ошибка в книге C++
указатели,вроде ошибка в книге C++
Непонятная операция в листинге C++
Ошибка в книге Шилдта? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 18:23     Ошибка в листинге в книге #2
В чём вопрос?
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
C++
1
2
while (cin && cin.get () != '\n') //ошибка скорей всего здесь
 continue;
Тут ошибки не вижу. Срабатывает, если введено больше чем MaxLen - 1. Извлекает из потока то, что осталось (и '\n').

Цитата Сообщение от tramp_1-3 Посмотреть сообщение
C++
1
2
if (!cin || temp [0] == '\0') //пустая строка?
 break; //i не имеет приращения
Выход, если пустая строка.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
26.03.2013, 02:06  [ТС]     Ошибка в листинге в книге #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут ошибки не вижу. Срабатывает, если введено больше чем MaxLen - 1. Извлекает из потока то, что осталось (и '\n').
Просто программа прерывается после ввода первого выражения и вылетает с ошибкой. Если закомментировать эту строку то она работает некорректно, но вылетов нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 02:37     Ошибка в листинге в книге #4
Тут другое. В 9 строке ввод через cin >> происходит, после этого в потоке всегда остаётся '\n'. cin.get (temp, MaxLen); читает его первым, для него это пустая строка. Реакция у него такая: "Если пустая строка (т.е., '\n' - первый), то чтение останавливается и устанавливается failbit(в отличие от getline(char&, int)), символ '\n' остаётся в очереди (в отличие от getline(char&, int)), в строку ввода помещается '\0';" После этого поток становится нерабочим и срабатывает это (!cin):
C++
1
2
if (!cin || temp [0] == '\0') 
break;
Что можно сделать:
C++
1
(cin >> name).get();
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
26.03.2013, 08:23  [ТС]     Ошибка в листинге в книге #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Что можно сделать:
Код C++
1
(cin >> name).get();
Теперь программа ведет себя немного иначе: просит имя, после ввода можно ввести ещё что-то, потом закрывается. Про особенность cin я знал. Пытался нейтрализовать её использованием сразу после него cin.ignore (1);, но результат так же не впечатлил.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 17:50     Ошибка в листинге в книге #6
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
Теперь программа ведет себя немного иначе
Про всю программу я не знаю, я пишу насчёт куска кода в main(). Вот этот кусок, немного переделанный (name и массив sayings объявлены как string, и добавлено извлечение '\n' после работы cin >>) и результат работы кода:
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
#include <iostream>
//#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
 
const int ArSize = 10;
const int  MaxLen  = 81;
 
int main () 
{
    using std :: cout;
    using std :: cin;
    string name;
    cout << "Hi, what's your name?\n";
    (cin >> name).get();
    cout << name << ", please enter up to " << ArSize
        << " short sayings <enter empty line to quite>:\n";
        
        string sayings [ArSize];    //массив объектов
        char temp [MaxLen];     //временное хранилище
        int i;
        for (i = 0; i < ArSize; i++) 
        {
            cout << i + 1 << ": ";
            cin.get(temp, MaxLen);
            while (cin && cin.get () != '\n')     //ошибка скорей всего здесь
                continue;
            if (!cin || temp [0] == '\0')   //пустая строка?
                break;                  //i не имеет приращения
            else    
                sayings [i] = "0";    //перегружаемое присваивание
        }
    
    
     system("pause");
     return 0;
}
Накаких ошибок.
Миниатюры
Ошибка в листинге в книге  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 19:34     Ошибка в листинге в книге #7
Сейчас посмотрел весь код. Для cin >> name ничего добавлять не нужно, здесь работает перегруженный оператор, в нём работает get(char&, int), после которого стоит конструкция убирающая '\n' из потока:
C++
1
2
 while (is && is.get () != '\n')
        continue;
. Такая же конструкция стоит и в цикле for(), в main(), иначе, при каждом цикле, поток ввода ломался бы. У меня программа вылетала здесь:
C++
1
 sayings [i] = 0;    //перегружаемое присваивание
Оператор присваивания перегружен для const char * и для const String &. Здесь идёт присвоение числа. Если преписать так:
C++
1
sayings [i] = "0";
то всё работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 12:55     Ошибка в листинге в книге
Еще ссылки по теме:

C++ укажите на ошибку в листинге
C++ Ошибка в книге или я что то не понимаю ?
C++ Компилятор не дает написать main без int. Ошибка в книге, или в С так можно?

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

Или воспользуйтесь поиском по форуму:
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
29.03.2013, 12:55  [ТС]     Ошибка в листинге в книге #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Такая же конструкция стоит и в цикле for(), в main(), иначе, при каждом цикле, поток ввода ломался бы. У меня программа вылетала здесь:
Нашел сам ошибку позже, спасибо вам за помощь, удачи вам.
Yandex
Объявления
29.03.2013, 12:55     Ошибка в листинге в книге
Ответ Создать тему
Опции темы

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