с++ массив строк
нужно написать код на языке с++, в котором с консоли вводится парное количество строк, затем с каждой парной строки удаляются все слова, которые встречаются в предыдущей строке. Я пока далеко от решения. Пока что-то в духе:
#include <cstring>
using namespace std;
int const a = 8;
void cut(char s[a][30])
{
char delimeters[] = " .,";
int i;
for (i = 1; i <= a; i += 2)
{
char* word = strtok(s[i], delimeters);
char* prev_word = strtok(s[i - 1], delimeters);
while (word != nullptr)
{
while (prev_word != nullptr)
{
prev_word = strtok(nullptr, delimeters);
int parameter = strcmp(word, prev_word);
if (parameter == 0)
{
cout << "function to delete" << endl;
}
}
word = strtok(nullptr, delimeters);
}
}
}
int main()
{
int i;
char text[a][30];
for (i = 0; i < a; i++)
{
cout << "Enter string " << i + 1 << ": ";
cin.getline(text[i], 30);
}
cut(text);
}
На условие в if не обращайте внимание, потом допишу. Пока так, потому что нужно хоть как-то контролировать правильность. Проблема в том, что при условии наличия в двух строках одинаковых слов я в конце должен хоть раз получить строку function to delete, а ее нет. В то же время появляется вот такое вот чудо:
.
Посоветуйте что-нибудь, пожалуйста
Ответы (1 шт):
Пролема возникает из-за двух ошибок.
Первая: (https://en.cppreference.com/w/cpp/string/byte/strtok) функция strtok содержит в себе статическую переменную buffer, которой присваивается значение входной строки, если она ненулевая. Проблема в том, что эта static переменная одна для всех вызовов функции, т.е. когда вы после word присваиваете priv_word strtok, вы по сути предыдущее значение (s[i]) затираете.
Вторая: У вас во втором цикле prev_word = strtok(nullptr, delimeters); идёт перед сравнением строк, из-за чего не учитывается первое слово или же, если строка состоит из одного слова, сравнение идёт с nullptr и возникает ошибка
Возможный вариант исправленного кода:
#include <cstring>
#include <iostream>
class StrTok {
char* buffer;
public:
StrTok(): buffer(nullptr) {}
char* strtok(char* str, const char* delim) {
if (str)
buffer = str;
buffer += std::strspn(buffer, delim);
if (*buffer == '\0')
return nullptr;
char* const tokenBegin = buffer;
buffer += std::strcspn(buffer, delim);
if (*buffer != '\0')
*buffer++ = '\0';
return tokenBegin;
}
};
template<size_t N, size_t M>
void cut(char (&s)[N][M])
{
StrTok st1, st2;
char delimeters[] = " .,";
for (size_t i = 1; i < N; i += 2)
{
char* word = st1.strtok(s[i], delimeters);
char* prev_word = st2.strtok(s[i - 1], delimeters);
while(word) {
while (prev_word) {
int parameter = strcmp(word, prev_word);
if (!parameter) {
// Здесь могла быть ваша реклама ;)
}
prev_word = st2.strtok(nullptr, delimeters);
}
word = st1.strtok(nullptr, delimeters);
prev_word = st2.strtok(s[i - 1], delimeters);
}
}
}
int main()
{
const size_t N = 4, M = 30;
char text[N][M];
for (size_t i = 0; i < N; ++i)
{
std::cout << "Enter string " << i + 1 << ": ";
std::cin.getline(text[i], M);
}
(void) cut(text);
}