Строки в С/С++, удаление элементов

125
22 декабря 2020, 13:30

Задача: Есть массив char text[20][81], в нем записаны строки, необходимо найти и удалить содержимое правильно расставленных скобок, включая сами скобки. Сложность заключается в том, каким образом мне нужно определить пару для скобки среди других пар? При том, что скобки могут иметь пару на другой строке.

int index = 0, j = 0;//переменные для циклов
int open = 0, close = 0;//подсчет скобок
int arrayL[80] = {};//массив индексов левых скобок
int arrayR[80] = {};//массив индексов правых скобок
int l=0, r=0; // счетчик индексов для массива
while (index < strCount)
{
    while (text[index][j] != NULL)
    {
        switch (text[index][j])
        {
        case '(': 
        {
            open++;
            arrayL[l] = j;
            l++;
        }
        case ')':
        {
            close++;
            arrayR[r] = j;
            r++;
        }
        }
        j++;
    }
    index++;
}

Моя попытка создать массив из левых и правых скобок, но в случае если скобки будут на разных строках придётся прикручивать костыль в виде подсчета элементов между ними(планировалось просто отнять от большего меньшее в стандартном случае)

Answer 1

Задача поиска парных скобок стара, как мир :-) И решение её известно давным-давно.

  1. Заводим логическую переменную - флажок, сигнализирующий о том, что мы находимся внутри скобок. Вроде int inside = 0;
  2. Просматриваем весь список строк, как единый буфер (автоматически переходя со строки на строку) и выбираем из него по одному символу.
  3. Если inside == 0 и очередной символ '(' - взводим флаг. Символ НЕ копируем.
  4. Если inside != 0 и очередной символ ')' - сбрасываем флаг. Символ НЕ копируем.
  5. Если inside == 0 просто копируем символ.

Если при достижении конца буфера выяснилось, что inside != 0, то это означает, что нарушен синтаксис расстановки скобок.

Разумеется, это очень черновой вариант. Но, я думаю, идея понятна.

Answer 2
int i, j, n, k=0;//переменные для цикла
int lenght;//длина строки
int indL[2] = {}, indR[2] = {};//левая и правая скобка соотв.
int flag = 0;//показатель была ли найдена открывающая скобка, 1 - найденна левая скобка
//[0] - координата по У; [1] - координата по Х
//Поиск последней закрывающей скобки
for(i = lineIndex; i < strCount; i++)
{
    lenght = strlen(text[i]);
    for (j = characterIndex; j <= lenght; j++)
    {
        if (text[i][j] == ')')
        {
            indR[0] = i; 
            indR[1] = j;
            for (n = i; n > -1; n--)
            {
                while (k < 81 && k != NULL && k < j)
                {
                    if ('(' == text[i][j])
                    {
                        indL[0] = i;
                        indL[1] = j;
                        flag = 1;
                    }
                    k++;
                }
                if (flag) n = -1;//ОСТАНОВОЧКА
            }
            if (flag)
            {
                brackets[0] = indL[0];
                brackets[1] = indL[1];
                brackets[2] = indR[1];
                brackets[3] = indR[0];
                j = 81;//АСТАНОВОЧКА
                i = strCount;//ТОЖЕ АСТАНОВОЧКА
            }
        }
    }
}
if (flag != 2)
{
    brackets[0] = -1;
    brackets[1] = -1;
    brackets[2] = -1;
    brackets[3] = -1;
}

Я решил эту задачу путем поиска закрывающей скобки, т.к. удобнее всего производить поиск парной(просто найти ближайшую). Там если мы нашли закр. скобку, то производится поиск в обратном порядке, пока не найдем открывающую, если не нашли, то ищем другую закрывающую. Мне показался этот способ самым наглядным. Принимаю критику что можно сделать по другому)

READ ALSO
Не срабатывает else С++ ReadFile com

Не срабатывает else С++ ReadFile com

Читаю данные с последовательного порта, с arduinoНашел код в интернете, но он странно работает

136
C++ COM с помощью fstream

C++ COM с помощью fstream

Читаю данные из ком порта делал это с помощью readFile С которым раньше серьёзно никогда не работал, код просто непонятныйПотом подумал если...

128
В чем ошибка использования strlen?

В чем ошибка использования strlen?

Почему не выводит текст с буквой t на конце? Правильно ли я пытаюсь задать конец строки?

128