Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2013, 23:13   #21
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Chainik! Посмотреть сообщение
Знаки пунктуации:
Поскольку слова состоят только из букв и цифр, можно инверсировать проверку - проверять не на пробел/знак пунктуации, а на букву/цифру (что можно сделать с помощью стандартной isalnum или небольшим ifом). Краткий пример:
Код:
#include <iostream>
#include <cctype>

size_t count_words(const char *s) {
    size_t count = 0, inword = false;
    for (; s && *s; ++s)
        inword = isalnum(*s) || inword && !++count;
    return count + inword;
}

int main() {
  std::cout << count_words(" .. , ! ? Hello,, ,,,,,,, ,, word..! apple orange!") << std::endl;
}
netrino вне форума Ответить с цитированием
Старый 27.08.2013, 18:27   #22
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Поскольку слова состоят только из букв и цифр, можно инверсировать проверку - проверять не на пробел/знак пунктуации, а на букву/цифру (что можно сделать с помощью стандартной isalnum или небольшим ifом). Краткий пример:
Код:
#include <iostream>
#include <cctype>

size_t count_words(const char *s) {
    size_t count = 0, inword = false;
    for (; s && *s; ++s)
        inword = isalnum(*s) || inword && !++count;
    return count + inword;
}

int main() {
  std::cout << count_words(" .. , ! ? Hello,, ,,,,,,, ,, word..! apple orange!") << std::endl;
}
Поясните, пожалуйста, почему такое условие: s && *s. Вторая часть понятна. У нас строка завершается *s == 0
8Observer8 вне форума Ответить с цитированием
Старый 27.08.2013, 18:43   #23
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Поясните, пожалуйста, почему такое условие: s && *s. Вторая часть понятна. У нас строка завершается *s == 0
Первую часть следовало бы вынести из цикла, это проверка на нулевой указатель, чтобы программа не падала, если в функцию передать NULL.
netrino вне форума Ответить с цитированием
Старый 27.08.2013, 18:48   #24
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Так она всё равно падает:

Код:
    if (s == NULL) {
        return 0;
    }
8Observer8 вне форума Ответить с цитированием
Старый 27.08.2013, 18:49   #25
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
если в функцию передать NULL.
Нее, это я туплю) понял

Я тест сейчас правильно написал:

Код:
void newtestclass::testCount_words_02() {
    const char* s = NULL;
    size_t actual = count_words(s);
    size_t expected = 0;
    CPPUNIT_ASSERT_EQUAL_MESSAGE("No initialization", expected, actual);
}
До этого у меня было:
Код:
void newtestclass::testCount_words_02() {
    const char* s;
    size_t actual = count_words(s);
    size_t expected = 0;
    CPPUNIT_ASSERT_EQUAL_MESSAGE("No initialization", expected, actual);
}

Последний раз редактировалось 8Observer8; 27.08.2013 в 18:55.
8Observer8 вне форума Ответить с цитированием
Старый 27.08.2013, 19:05   #26
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

У меня вопросы к автору темы. Почему символьный массив? Вы по заданию ограничены или сами так решили? Вам можно показывать примеры с STL?
8Observer8 вне форума Ответить с цитированием
Старый 28.08.2013, 22:33   #27
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Нашёл пример с Boost (с применением регулярного выражения) на этой страничке - http://www.cplusplus.com/forum/general/30929/

Код:
#include <vector>
#include <string>
#include <boost/algorithm/string/split.hpp>

int countWords(std::string str) {
  vector< std::string > result;
  boost::algorithm::split_regex(result, str, regex( "\\s+" ));
  return result.size();
}
Я исправил:
Код:
#include <vector>
#include <string>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/regex.hpp>

int countWords(const std::string& str) {
    std::vector< std::string > result;
    static const boost::regex re("[A-Za-z0-9]+");
    boost::algorithm::split_regex(result, str, re);
    return result.size()-1;
}

int main(int argc, char** argv) {
    std::string inputStr = ".. , ! ? Hello,, ,,,,,,, ,, word..! apple orange!";
    std::cout << "nw = " << countWords(inputStr) << std::endl;
    return 0;
}
Output:
Цитата:
nw = 4
P.S. Наконец-то появился повод использовать Boost и настроить его в NetBeans.

Инструкция "Как собрать Boost":
http://andres.jaimes.net/718/how-to-...es-on-windows/

Инструкция (решение моей проблемы, которое можно использовать, как инструкцию) "Как настроить Boost в NetBeans": http://forums.netbeans.org/topic56476.html
8Observer8 вне форума Ответить с цитированием
Старый 28.08.2013, 23:11   #28
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
P.S. Наконец-то появился повод использовать Boost и настроить его в NetBeans.
Не нужно.

http://www.cplusplus.com/reference/regex/
_Bers вне форума Ответить с цитированием
Старый 29.08.2013, 00:24   #29
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Я не знал, что появилась такая возможность в новом стандарте. Спасибо

Жаль, что нет в С++11 такой функции split_regex. Да и просто split. Мне недавно нужен был split через разделитель. Нашёл вот такой вариант:

Код:
#include <vector>
#include <sstream>
#include <iostream>

struct split {

    enum empties_t {
        empties_ok, no_empties
    };
};

std::vector <std::string> & split(
            std::vector <std::string> & result,
            const std::string& inputBuffer,
            const std::string& delimiters,
            split::empties_t empties = split::empties_ok);

std::vector <std::string> & split(
        std::vector <std::string> & result,
        const std::string& s,
        const std::string& delimiters,
        split::empties_t empties) {
    result.clear();
    size_t current;
    size_t next = -1;
    do {
        if (empties == split::no_empties) {
            next = s.find_first_not_of(delimiters, next + 1);
            if (next == std::string::npos) break;
            next -= 1;
        }
        current = next + 1;
        next = s.find_first_of(delimiters, current);
        result.push_back(s.substr(current, next - current));
    } while (next != std::string::npos);
    return result;
}

int main(int argc, char** argv) {
    std::string inputData = "Valencia 7x17/5x112 D70.1 ET48 Silver";
    std::vector<std::string> listOfData;
    split(listOfData, inputData, " ");
    for (int i = 0; i < listOfData.size(); i++) {
        std::cout << "item[" << i << "] = " << listOfData[i] << std::endl;
    }
    return 0;
}
Output:
Код:
Valencia
7x17/5x112
D70.1
ET48
Silver

Последний раз редактировалось 8Observer8; 29.08.2013 в 00:32.
8Observer8 вне форума Ответить с цитированием
Старый 29.08.2013, 01:09   #30
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

8Observer8,крайне не оптимально.
Я против копирования строк, и динамических аллокаций там, где можно обойтись
struct sub_string { size_t begin_position, size_t end_position, size_t id_token };
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчитать количество слов в предложении Sv. Microsoft Office Excel 2 04.01.2013 00:16
Ввести с клавиатуры строку. Посчитать количество слов в строке. Определить, что является разделителем слов. Вывести рез-ть на экра Газимов Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 02.03.2012 15:58
В предложении подсчитать количество слов. Delphi King21 Помощь студентам 4 16.03.2011 14:26
Подсчитать количество слов и количество букв MDSIQ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.11.2010 16:57
подсчитать количество символов слов и предложений nev Помощь студентам 4 09.06.2007 21:22