Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
1

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

25.03.2013, 17:32. Показов 878. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Читаю книгу Стивена Праты С++. Сперва было норм, но потом переводчик забухал. Нашел кучу ляпов, но здесь ниасилил.
хэд
Кликните здесь для просмотра всего текста
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;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2013, 17:32
Ответы с готовыми решениями:

Ошибка в книге?
Я тут наткнулся на непонятную ситуацию. Кто-нибудь скажет, почему там так написано(фото ниже)? (или...

Ошибка в книге Шилдта?
Герберт Шилдт. C++ базовый курс. Третье издание. 2010 г. с. 269. Шилдт явно использует для доступа...

Очередная ошибка в книге?
Я могу ошибаться, но мне кажется на странице 817 ошибка в книге. Пишется про защищенный раздел...

какая то ошибка в книге
При компилировки кричит на 1.Error 1 error LNK2019: unresolved external symbol _main referenced...

7
5498 / 4893 / 831
Регистрация: 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 не имеет приращения
Выход, если пустая строка.
0
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.03.2013, 02:06  [ТС] 3
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут ошибки не вижу. Срабатывает, если введено больше чем MaxLen - 1. Извлекает из потока то, что осталось (и '\n').
Просто программа прерывается после ввода первого выражения и вылетает с ошибкой. Если закомментировать эту строку то она работает некорректно, но вылетов нет.
0
5498 / 4893 / 831
Регистрация: 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();
1
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
26.03.2013, 08:23  [ТС] 5
Цитата Сообщение от alsav22 Посмотреть сообщение
Что можно сделать:
Код C++
1
(cin >> name).get();
Теперь программа ведет себя немного иначе: просит имя, после ввода можно ввести ещё что-то, потом закрывается. Про особенность cin я знал. Пытался нейтрализовать её использованием сразу после него cin.ignore (1);, но результат так же не впечатлил.
0
5498 / 4893 / 831
Регистрация: 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;
}
Накаких ошибок.
Миниатюры
Ошибка в листинге в книге  
1
5498 / 4893 / 831
Регистрация: 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";
то всё работает.
1
16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
29.03.2013, 12:55  [ТС] 8
Цитата Сообщение от alsav22 Посмотреть сообщение
Такая же конструкция стоит и в цикле for(), в main(), иначе, при каждом цикле, поток ввода ломался бы. У меня программа вылетала здесь:
Нашел сам ошибку позже, спасибо вам за помощь, удачи вам.
0
29.03.2013, 12:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2013, 12:55
Помогаю со студенческими работами здесь

Сдвиг байтов, ошибка в книге?
Прохожу тему по перемещению байтов. В книге написан код: j = 1 &lt;&lt; j в первый цикл он...

указатели,вроде ошибка в книге
снова ошибка в книге снова разочаровние...=\ вот код #include &lt;windows.h&gt; #include&lt;iostream&gt;...

Ошибка в книге или я что то не понимаю ?
Задача по наследованию: Написать класс &quot;Служащие&quot; которые получают только процент от продаж и...

Ошибка при подключении файла Sales_item.h из примера в книге
Делаю маленькие шажки по книге &quot;C++ базовый курс 2014&quot; Скачал файл &quot;Sales_item.h.&quot;, добавил в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru