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

Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.68
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
16.05.2014, 19:33     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #1
Извиняюсь заранее, если было уже где-то - я не нашел(
Штудирую Прату 6-е издание.

Полностью перекопировал Листинг 6.8.:
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 <iostream>
#include <cctype>
 
int main()
{
    using namespace std;
    setlocale(LC_ALL, "Russian");
    
    cout << "Введите произвольный текст для анализа, в конце введите символ \"@\"\n";
 
    char ch;
    int whitespace = 0;
    int digits = 0;
    int chars = 0;
    int punct = 0;
    int others = 0;
 
    cin.get(ch);
    while (ch != '@')
    {
        if (isalpha(ch))
            chars++;
        else if (isspace(ch))
            whitespace++;
        else if (isdigit(ch))
            digits++;
        else if (ispunct(ch))
            punct++;
        else
            others++;
        cin.get(ch);
    }
 
    cout << chars << " символов, "
        << whitespace << " пробелов, "
        << digits << " чисел, "
        << punct << " знаков препинания, "
        << others << " остального говна.\n";
    system("PAUSE");
    return 0;
}

И при сборке\выполнении в MS VS 2013 вылетает следующая ошибка - во вложении, помогите пожалуйста, а то ничего не пойму(
Миниатюры
Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 19:33     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука
Посмотрите здесь:

Страуструп.Язык программирования С++.3(спец.)издание.Глава4.Упражнение7 - возникли вопрос C++
C++ где скачать книгу "Язык программирования C. Лекции и упражнения Стивен Прата"
C++ Стивен Прата Кто Читал его ? - Нужен Совет
С. Прата. Язык программирования C++. Лекции и упражнения C++
Странная штука C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
16.05.2014, 19:51     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #2
У меня в VS 2008 ошибка не вылетает.
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
16.05.2014, 19:57  [ТС]     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #3
Тогда вообще мистика( У меня на двух компах (один Win7 - на работе, второй Win 8.1 - дом), на всех MS VS 2013, и одна фиговина - вылетает ошибка(
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,894
Записей в блоге: 1
16.05.2014, 19:58     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #4
Не вижу причин. У меня все работает. Попробуйте полностью пересобрать проект.
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <cctype>
 
using namespace std;
 
int main(int argc,char** argv)
{  
   setlocale(LC_ALL,"Russian");
   
   int   whitespace = 0;
   int   digits     = 0;
   int   chars      = 0;
   int   punct      = 0;
   int   others     = 0;
 
   cout << "Введите произвольный текст для анализа, в конце введите символ \"@\"\n";
 
   char  ch;
 
   cin.get(ch);
 
   while (ch != '@')
   {     
      if (isalpha(ch))
      {
         chars++;
      }
      else if (isspace(ch))
      {
         whitespace++;
      }
      else if (isdigit(ch))
      {
         digits++;
      }
      else if (ispunct(ch))
      {
         punct++;
      }
      else
      {
         others++;
      }
 
      cin.get(ch);
   }
 
   cout << chars      << " символов, "
        << whitespace << " пробелов, "
        << digits     << " чисел, "
        << punct      << " знаков препинания, "
        << others     << " остального говна.\n";
   
   return 0;
}
Миниатюры
Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука  
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
16.05.2014, 20:13  [ТС]     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #5
а что значит "полность пересобрать"? вроде и так пересобирается....
EVP
314 / 236 / 41
Регистрация: 14.12.2010
Сообщений: 457
16.05.2014, 23:04     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #6
Цитата Сообщение от CPPNoob Посмотреть сообщение
И при сборке\выполнении в MS VS 2013 вылетает следующая ошибка - во вложении, помогите пожалуйста, а то ничего не пойму(
Ты чего-то жмёшь, когда вводишь данные (например, ctrl-Z), и у тебя накрывается входной поток.

Автор книжки забил в этом примере на обработку ошибок, т.к. эту тему объясняет в других темах.
И не инициировал переменную ch по умолчанию...

Попробуй изменить немного пример так:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cctype>
 
#define NAFIK '@'
 
void get(char& ch)
{
    using namespace std;
    cin.get(ch);
    if (std::cin.fail())
        ch = NAFIK;
}
 
int main()
{
    using namespace std;
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите произвольный текст для анализа, в конце введите символ \"@\"\n";
 
    char ch = ' ';
    int whitespace = 0;
    int digits = 0;
    int chars = 0;
    int punct = 0;
    int others = 0;
 
    get(ch);
    while (ch != NAFIK)
    {
        if (isalpha(ch))
            chars++;
        else if (isspace(ch))
            whitespace++;
        else if (isdigit(ch))
            digits++;
        else if (ispunct(ch))
            punct++;
        else
            others++;
        get(ch);
    }
 
    cout << chars << " символов, "
        << whitespace << " пробелов, "
        << digits << " чисел, "
        << punct << " знаков препинания, "
        << others << " остального говна.\n";
    system("PAUSE");
    return 0;
}
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
16.05.2014, 23:11  [ТС]     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #7
Диагностировать удалось только то, что ошибка вылетает при вводе русских символов(( Английские проходят нормально... Посоветует кто нибудь что нибудь такое, чтобы исправить подобную проблему?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.05.2014, 23:17     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CPPNoob Посмотреть сообщение
ошибка вылетает при вводе русских символов
Цитата Сообщение от CPPNoob Посмотреть сообщение
Посоветует кто нибудь что нибудь такое, чтобы исправить подобную проблему?
Там, где используются функции cctype, например:
C++
1
if (isalpha((unsigned char)ch))
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
16.05.2014, 23:25  [ТС]     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #9
Так точно! Спасибо ОГРОМНОЕ! С применением unsigned char - всё заработало! А можете объяснить из-за чего такое происходит? Чтобы тоже в теме быть...
EVP
314 / 236 / 41
Регистрация: 14.12.2010
Сообщений: 457
16.05.2014, 23:28     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #10
Цитата Сообщение от CPPNoob Посмотреть сообщение
Так точно! Спасибо ОГРОМНОЕ! С применением unsigned char - всё заработало! А можете объяснить из-за чего такое происходит? Чтобы тоже в теме быть...
Можно ещё локаль передать в isalpha
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.05.2014, 23:32     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CPPNoob Посмотреть сообщение
А можете объяснить из-за чего такое происходит?
Знаковый и беззнаковый char. В разных реализациях по-разному бывает, поэтому у кого-то ошибки будут, у кого-то нет.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
16.05.2014, 23:36     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CPPNoob Посмотреть сообщение
С применением unsigned char - всё заработало!
потому что например русская "я" 0xFF
в signed -1
unsigned 255
о чем тебя и предупреждали в окошке когда вывалилась программа
у студии в настройка проекта есть пункт, кем считать char по умолчанию unsigned или signed
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.05.2014, 23:45     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #13
Цитата Сообщение от ValeryS Посмотреть сообщение
у студии в настройка проекта есть пункт, кем считать char по умолчанию unsigned или signed
Это где такое?
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
16.05.2014, 23:52     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Это где такое?
пишу по русски у меня русская 2008
проект
свойства
С/С++
язык
"По умолчанию char unsigned Да/нет
ключ /J

Добавлено через 1 минуту

Не по теме:

alsav22,мы же вроде где то обсуждали это

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 00:01     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #15
Цитата Сообщение от ValeryS Посмотреть сообщение
alsav22,мы же вроде где то обсуждали это
Не помню... Спросил потому, что в 10-й не нашёл.
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
17.05.2014, 00:15  [ТС]     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #16
2013 - нету..:
Миниатюры
Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 00:18     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #17
Цитата Сообщение от CPPNoob Посмотреть сообщение
2013 - нету..:
В 8-й есть, потом, наверное, убрали.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
17.05.2014, 00:32     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #18
а если вручную ключ вбить?
/J вкладка "командная строка"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 00:41     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #19
Цитата Сообщение от ValeryS Посмотреть сообщение
а если вручную ключ вбить?
/J вкладка "командная строка"
Так работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 01:23     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука
Еще ссылки по теме:

C++ Стивен Прата (гл. 6, упр. 6) - массив структур
C++ Стивен Прата (гл. 8, упр. 4) - структура с методами и использование new
C++ Стивен Прата - про decltype (гл. 8, стр. 422)

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

Или воспользуйтесь поиском по форуму:
CPPNoob
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 7
17.05.2014, 01:23  [ТС]     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука #20
угу, в 2013 тоже работает.
В общем разобрались - всем ОГРОМНОЕ СПАСИБО!
Yandex
Объявления
17.05.2014, 01:23     Стивен Прата Язык программирования C++ лекции и упражнения (6-е издание). Листинг 6.8 - странная штука
Ответ Создать тему
Опции темы

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