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

функция подсчета слов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Определить количество одинаковых букв http://www.cyberforum.ru/cpp-beginners/thread192442.html
Помогите написать программу которая считывает текст из файла и определяет количество одинаковых букв ПО ПАРАМ слов в предложении. Например нам дано предложение: "Система управления базой...
C++ метод по добавлению нового объекта в массив объектов Как при помощи ссылок в java создать метод по добавлению нового объекта в массив объектов(например,-новый номер в справочник) ? что делать с длиной массива, ведь её никак не увеличишь? http://www.cyberforum.ru/cpp-beginners/thread192436.html
C++ Циклы с постусловием и с предусловим
Дано натуральное число. Верно ли, что в его десятичной записи есть шесть единиц подряд? У меня вообще мозг не пашет как это сделать... Пожалуйста! Помогите как можно скорее! Прошу! :cry:
поменять местами элементы массива при условии C++
Ниже представлен мой код,в комментариях написал как работает программа. Работает правильно-из одного массива записывает в другой все четные цифры,а из первого удаляются(обнуляются) эти числа. ...
C++ Напишите программу, вычисляющую среднее арифметическое двух чисел http://www.cyberforum.ru/cpp-beginners/thread192413.html
Всем привет! Народ помогите с задачкой, нужно сделать в Microsoft Visual Studio. Задача: Напишите программу, вычисляющую среднее арифметическое двух чисел.
C++ Работа с файлами Как можно создавать файлы в цикле? Например, хочу создать 10 файлов в определенной директории. подробнее

Показать сообщение отдельно
schdub
2952 / 1297 / 239
Регистрация: 19.01.2009
Сообщений: 3,409
Завершенные тесты: 1
17.11.2010, 02:15
Цитата Сообщение от JerryJackson Посмотреть сообщение
char str1[]="Привет! nil laba_12 chaos? UFO";
У Вас в задании была именно такая строка?

Важно точно определить, какой набор символов является разделителем слов. Если только пробелы, пользуйте isspace(), а если например, так же и символы пунктуации, то нужно еще пользовать ispunct() (хидер ctype.h).

Вот первая версия, которую подсказывает логика:
C
1
2
3
4
5
6
7
8
9
10
11
12
int xcount(const char * p)
{
    int n = 0;
    while (*p)
    {
        while (*p && (isspace(*p) || ispunct(*p))) ++p;
        if (!*p) break;
        while (*p && !isspace(*p) && !ispunct(*p)) ++p;
        ++n;
    }
    return n;
}
Возвращаясь к строке-образцу, нужно отметить 2 важных момента:

1 Дело в том, что здесь есть русские символы, а это отрицательное значение (русские символы более максимального положительного значения типа данных char) и поэтому их нельзя использовать вместе с функциями ispunct(), isspace() и т.д. в исходниках CRT, например, стоят асерты на положительное значение передаваемых ей аргументов.

Данную проблему можно победить кастом из char * в unsigned char *, но это имхо не красиво:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
int xcount(const char * ptr)
{
    int n = 0;
    unsigned char * p = (unsigned char *) ptr;
    while (*p)
    {
        while (*p && (isspace(*p) || ispunct(*p))) ++p;
        if (!*p) break;
        while (*p && !isspace(*p) && !ispunct(*p)) ++p;
        ++n;
    }
    return n;
}
2. Обращаю внимание на вот это слово - laba_12 из образца. Символ '_' является знаком пунктуации, а следовательно, разделителем слов. По идее если символы пунктуации считать разделителем слов, то здесь будет два слова 'laba' и '12'.

Если символ '_' всеже необходимо использовать, то вот несколько "костыльное" решение:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int xcount(const char * ptr)
{
    int n = 0;
    unsigned char * p = (unsigned char *) ptr;
    while (*p)
    {
        while (*p && (isspace(*p) || ispunct(*p))) ++p;
        if (!*p) break;
        while (*p && !isspace(*p) && (*p == '_' || !ispunct(*p))) ++p;
        ++n;
    }
    return n;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru