Другие языки программирования и технологии

C++ char arrays - прошу помощи с задачей.

Задача звучит так:

Дана строка слов, разделённых пробелами. Определите количество слов, которые встречаются более одного раза.

Я пытаюсь решить её два дня. Написала какого-то монстра из пяти функций, который при этом имеет кучу багов (как то: если повторяются последнее и предпоследнее слово, программа виснет).

Не хочу продолжать, так как дело явно идёт не туда. Задача находится в разделе "простые задания", т. е. должно быть что-то очень простое, что не приходит мне в голову. Возможно, даже настолько простое, чтобы влезть в форму ответа. :)

В учебнике строки определяются, как char arrays, соответственно, ими, видимо, и нужно пользоваться. Хотя если вы подскажете, как решить задачу другими способами, я тоже буду очень благодарна.

Спасибо всем!
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
struct compare {
bool operator()(char const* a, char const* b)const {
return strcmp(a, b) < 0;
}
};
int main() {
char line[] = "123 456 789 147 123 258 456 369 123";
char* context = nullptr;
auto separator = " ";
map<const char*, int, compare> tokens;
auto token = strtok_s(line, separator, &context);
if (token) ++tokens[token];
while (token != nullptr) {
token = strtok_s(nullptr, separator, &context);
if (token) ++tokens[token];
}
for (auto item : tokens) if (item.second > 1) cout << item.first << '\n';
cin.get();
}
Вячеслав Пилецкий
Вячеслав Пилецкий
94 801
Лучший ответ
Вариант
создать динамический массив массивов char
и деля строку по разделителям напихать в его элементы
а потом спокойно эти субстроки сравнивать

или класс "слово"
и массив слов или список (удобнее двусвязный, а не цепной)
и опять же сравнивать и считать - хоть тем же strcmp()

___
если список
элемент из
{ массив char для слова
число, затравочное 0
указатель на следующий
}
первому слову ставить 1 а его повторы метить прибавляя по единичке
потом опять сначала от того где остался 0
в конце опять сначала посчитать количество двоек ( 3,4,5... отпадут как лишние )
Попробуй через string, так проще. Но если нужно именно через массив символов, то сейчас попробую, тогда и напишу, если выйдет.

Вот код, в нём в s будет сохраняться вся строка с пробелами.
Обработку, наверное, сделать через вложенный цикл.

#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "string"

using namespace std;

int main()
{
setlocale(LC_ALL, ".1251");

char *s = new char[50];
gets_s(s,50);
cout << "\n" << s << endl;

system("pause");
}
Ремонт,,,отделка,,,, Ремонт,,,, Если не выйдет, тоже напиши, пожалуйста. Я заинтригована :)
Ремонт,,,отделка,,,, Ремонт,,,, Не, ну я знаю, как ввести с клавиатуры массив символов)
Следующим шагом будет выделить из строки первое слово. С этим я тоже справилась.
Затем надо подсчитать, сколько раз это слово встречается в оставшейся строке и сохранить это куда-то.
Затем надо удалить из строки первое слово везде, где оно встречается.
Затем убрать лишние пробелы.
Затем из урезанной строки выделить первое слово и т. д.

Монструозная программа, которая это делает, написана, но имеет баги.

В общем, слишком сложно для "простого задания".
Я думала, может, есть какие-то библиотечные функции, о которых я не знаю...