С++ Как сделать белый список для строки

104
05 мая 2021, 10:30

Хотел бы спросить.как сделать белый список для строки?Ну то есть есть слова которые можно писать в этой строке и если в строке обнаружено слово которое не входит в этот список ,написать,например 'Ошибка'.При это слова помещённые в кавычки не проверять.

Вот мои потуги:

bool backslash = false;
string text;
cout << "Text: ";
getline(cin, text);
vector<string> words;
istringstream flow(text);
text.clear();
while (flow >> text)
{
    int test = 0;
    for (unsigned int i = 0; i < text.size(); i++)
    {
        if (text[i] == '\"')
            backslash = !backslash;
            break;
    }
    test%=2;
    for (unsigned int i = 0; i < text.size(); i++)
    {
        if (!backslash) {
            if(text != "hello") {
                if(text != "world") {
                    cout << "ERROR" << endl;
                    return 0;
                }
            }
        }

    }
}

return 0;
Answer 1

Исходя из тега C++, я бы использовал множество set<string> для слов. Или unordered_set.

Далее - анализ основной строки, разбор на слова. Вопросов два.

  1. в том что такое слово - т.е. что служит разделителями слов (или что не может входить в слово). От этого зависит способ обработки.

  2. как обрабатывать кавычки. Можно просто сразу находить кавычки и вырезать все в них находящееся, после чего просто работать со строкой слов. Можно кто-то типа конечного автомата, считая кавычку отдельным словом, скажем. И после его прочтения игнорировать все слова до очередного слова-кавычки.

В зависимости от конкретных условий решения вопросов немного отличаются. Если уточните вопрос - можно будет уточнить и ответ...

Update

Ну вот по вашему уточнению...

#include <iostream>
#include <sstream>
#include <string>
#include <set>
using namespace std;
bool error(string s, const set<string>& dict)
{
    size_t quot;
    while((quot = s.find("\"")) != s.npos)
    {
        size_t last = s.find("\"",quot+1);
        if (last == s.npos)
            throw("Wrong quotes!");
        s.erase(quot, last-quot+1);
    }
    istringstream is(s);
    while(is >> s)
        if (dict.find(s) == dict.end()) return true;
    return false;
}
int main()
{
    set<string> dict { "hello", "world", "dolly" };
    cout << (error("hello \" white \" dolly",dict) ? "Error" : "OK" ) << endl;
    cout << (error("hello  white  dolly",dict) ? "Error" : "OK" ) << endl;
}
READ ALSO
Удаление последнего элемента в списке

Удаление последнего элемента в списке

Прошу не ругать если я что-то не так объяснил, мне 15 летЯ увлекаюсь программированием на языке С++

105
Как получить кол-во элементов массива

Как получить кол-во элементов массива

Допустим, есть матрица

73
что означает это строка кода *(*(p = new double*) = new double) = 2;

что означает это строка кода *(*(p = new double*) = new double) = 2;

что означает это строка кода *(*(p = new double*) = new double) = 2;

95
Есть ли в Windows сигналы похожие на те что в POSIX?

Есть ли в Windows сигналы похожие на те что в POSIX?

А нет ли в Windows ничего такого, похожего на сигналы в POSIX?

66