В строке нужно подсчитать сколько раз встречается каждое слово

187
06 апреля 2018, 18:52

Здравствуйте! Задача такая: в строке нужно подсчитать сколько раз встречается каждое слово. К примеру, строка: «one two three». Результат: one встречается один раз two встречается один раз three встречается один раз
Строку на слова я разделил, но как дальше сделать не знаю. Если можно, то нужно написать как можно проще, используя просто стандратные функции работы со строками. Заранее спасибо за помощь! Вот моя программа:

void main()
{
    setlocale(LC_ALL, "Russian");
    char string[256], *p;
    int i;
    cout << "Введите строку: ";
    cin.getline(string, sizeof(string));
        p = strtok(string, " .,/!?");
        while (p != 0) {
            cout << p << endl;
            p = strtok(0, " .,/!?");
        }
    system("pause");
}
Answer 1

Возьмите

map<string, int> m;

и просто добавляйте все слова как

m[p]++;

По окончании работы для каждого слова получите нужное значение, скажем,

for(auto i: m) cout << i.first << " : " << i.second << endl;

Если, как Сухову - "лучше, конечно, помучиться" (с), то

struct item { char * name, int count; }
item ii[МНОГО]; int size = 0;

Дальше для каждого слова проверять, есть ли оно в ii[0] -- ii[size-1], если нет - заносить в ii[size], счетчик сбрасывать в 1, size увеличивать. Если есть - увеличивать соответствующий счетчик...

Answer 2

Как вы просили - с помощью стандартных функций. Например:

using namespace std;
vector<string> v;
int k = 0;
// если вводите с консоли
copy(istream_iterator<string>(cin), istream_iterator<string>(), 
     back_inserter(v));
auto P = v.begin();
while(!v.empty()) {
    k = count(P, v.end(), *P);
    cout << *P << " ... " << k << endl;
    string s = *P;
    v.erase(std::remove(P, v.end(), s), v.end());
}

Можете также переделать свой код. Та же логика на языке 'C' будет выглядеть например так:

char string[256], *p;
char* m[100];
int i  = 0, k = 1;
std::cout << "..." << std::endl;
std::cin.getline(string, sizeof(string));    
p = strtok(string, " .,/!?");
while (p != 0) {
    m[i] = new char[strlen(p) + 1];
    std::cout << p << std::endl;
    strcpy(m[i], p);
    p = strtok(0, " .,/!?");
    ++i;
}
const char* q = "-";
std::cout << i << std::endl;
for (int j = 0; j < i; ++j) {
    if(!strcmp(m[j], q)) continue; 
// при равенстве strcmp возвращает 0             
    for (int n = j + 1; n < i; ++n)
        if (!strcmp(m[j], m[n])) {
            ++k;
            delete m[n];
            m[n] = new char[2];
            strcpy(m[n], q);
        }
    std::cout << m[j] << "..." << k <<"..." <<std::endl;
    delete m[j];
    k = 1;
}
READ ALSO
Операции приведения типов С++

Операции приведения типов С++

Всем приветИзучая книгу Бьярне Страуструпа, я наткнулся на интересный, по моему мнению, пример:

155
Возникла проблема с задачей

Возникла проблема с задачей

Не понимаю, что не так с моим алгоритмом, но на сайте выдает что ошибка на одном из тестов проверкиОшибка в реализации алгоритма или в самом...

192