Помогите новичку C++ [требует правки]

237
22 марта 2018, 09:17

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

#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int i;
int k;
void proc(char str[100], char str1[100]) {
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] != '(') {
            str1[i] = str[i];
        }
        else {
            for (int p = i; str[p] != ')'; p++) {
                k++;
            }
        }
        if (str[i] == ')') {
            str[i] = str[i + k];
        }
    }
}
void print(char str1[100]){
    puts(str1);
}
void main() {
    char str[100];
    char str1[100];
    cout << "Vvedite simvoli" << endl;
    cin>>str;
    proc(str,str1);
    print(str1);
    system("pause");
}
Answer 1
#include <iostream>
#include <string>
using namespace std;
void proc(char str[100], char str1[100])
{
    bool skobka_found = false; // флаг найдена открывающая скобка
    int j = 0; // счетчик символов второй строки
    for (int i = 0; str[i] != '\0'; i++)
    {
        // Нашли скобку - выставили флаг
        if (str[i] == '(')
        {
            skobka_found = true;
        }
        // Пока флаг НЕ установлен копируем все символы во вторую строку, Как только скобка будет найдена, то копировать перестаем
        if (skobka_found == false)
        {
            str1[j] = str[i];
            j++;
        }
        // Нашли закрывающую скобку - сбросили флаг
        if (str[i] == ')')
        {
            skobka_found = false;
        }
    }
}
void print(char str1[100])
{
    puts(str1);
}
int main() {
    char str[100] = { 0 }; // Важно обнулить все символы массива, иначе там будет ненужный мусор, можно сделать это командой memset
    char str1[100] = { 0 };
    cout << "Vvedite simvoli" << endl;
    cin>>str;
    proc(str,str1);
    print(str1);
    system("pause");
    return 0;
}

Результат:

Vvedite simvoli
asd(dsa)qwe(ewq)()
asdqwe
Answer 2

Ну, вот вариант для вложенных скобок - но неверная вложенность просто игнорируется.

#include <iostream>
#include <string>
using namespace std;
string deleter(const string& s)
{
    string res;
    res.reserve(s.length());
    int flag = 0;
    for(char c: s)
    {
        switch(c)
        {
        case '(': flag++; break;
        case ')': if (flag > 0) --flag;
                  else {
                      /* Тут должна быть реакция на неверно вложенные скобки*/
                  }
        break;
        default : if (!flag) res += c;
        }
    }
    return res;
}

int main()
{
    cout << "Input string: ";
    string in;
    getline(cin,in);
    in = deleter(in);
    cout << in << endl;
}
READ ALSO
Error: no matching function for call to ‘Triangle::Triangle(double, double, double)

Error: no matching function for call to ‘Triangle::Triangle(double, double, double)

Подскажите пожалуйста, что не так, а то вроде бы типичный код, а ошибка одна и та же постоянно, если что OS Linux Ubuntu, IDE AnjutaЗаранее спасибо за ответы

219
Каким образом распакавать bz2 архив С++/Qt?

Каким образом распакавать bz2 архив С++/Qt?

Необходимо распаковать архивbz2, желательно без внешних зависимостей

238
Указатель на метод класса внутри класса

Указатель на метод класса внутри класса

Мне понадобилась масса таймеров на чистом с++Для решения задачи я пытаюсь использовать список, элементы которого содержат указатели на функции...

243
Как построить фрактал?

Как построить фрактал?

Принимаю любую помощь/советы в построении фракталаСама попыталась реализовать через строку и повороты (но это вроде бы фракталом не является)...

226