平衡括号C++不工作,我做错了什么

izj3ouym  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(107)
#include<iostream>
#include<string>
using namespace std;

main()
{
    int i, j=0, perlen, countcp=0, countsp=0, countrp=0, countcl=0, countsl=0, countrl=0;
    string str, str1;
    cout<<"Please enter string"<<endl;
    getline(cin, str);
    perlen=(str.length())/2;
    for(i=0; i<str.length(); i++)
    {
        if(str[i]=='{')
            countcp++;  
        if(str[i]=='[')
            countsp++;
        if(str[i]=='(')
            countrp++;
        if(str[i]=='}')
            countcl++;
        if(str[i]==']')
            countsl++;
        if(str[i]==')')
            countrl++;
    }
    str1=str;

    if(countcp==countcl and countsp==countsl and countrp==countrl)
    {
        cout<<"equal"<<endl;
        int countwhile=0, j=0;
        while(!str.length()==0)
        {
            if(str[j]=='{' and str[j+1]=='}')
            {
                str.erase(i, 2);
                countwhile++;
            }
            else if(str[j]=='(' and str[j+1]==')')
            {
                str.erase(i, 2);
                countwhile++;
            }
            else if(str[j]=='[' and str[j+1]==']')
            {
                str.erase(i, 2);
                countwhile++;
            }
            if(countwhile>perlen)
            {
                countwhile=1;
                cout<<"reached break"<<endl;
                break;
            }
            j++;
        }
        if(countwhile==1)
        {
            cout<<"Balanced string "<<str1<<endl;
        }
    }
}

我试图平衡括号。输入将包括花括号,圆括号和方括号。我试图找到我做错了什么,在这段代码。我是新的c++,我正在努力学习。
解说

curly在p中括号的计数
s方形o钢笔括号的计数

圆开括号计数器
countcl用于结束花括号或结束花括号
方括号的计数
圆括号计数
例如输入{()}
输出平衡
输入{(}{)}
输出不平衡,它工作到第30行,并打印相等,之后它给出错误分段错误(核心转储)

t8e9dugd

t8e9dugd1#

我看到的问题:

  1. main中缺少返回类型。请使用:
int main() ...

1.访问数组越界。您有:

while ( !str.length() == 0 )

这是不够的,你还需要确保你不会访问str超出范围,因此,将其更改为:

while ( !str.length() == 0 && j+1 < str.length() )

或者更好的是

while ( !str.empty() && j+1 < str.length() )

使用j+1是必要的,因为您要在循环中访问str[j+1]
1.从字符串中擦 debugging 误的元素。

str.erase(i, 2);
//        ^^

使用

str.erase(j, 2);
//        ^^

1.您没有正确更新j的值。假设str等于"{()}". When j is equal to 1 , you are trying to remove()from the string. After that, str is equal to "{}"。为了能够处理该问题,您需要将j的值设置为0。逻辑需要为:
当不存在匹配时,递增j
当存在匹配项时,j递减,匹配的字符将被删除。

    • 改进建议**

ij使用无符号类型以避免编译器警告。
您可以使用:

std::string::size_type i = 0;
std::string::size_type j = 0;
    • while循环的更新版本,包含上述修复**

我还添加了额外的cout行来帮助诊断逻辑错误。

int countwhile=0;
  std::string::size_type j=0;
  while(!str.length()==0 && j+1 < str.length())
  {
     if(str[j]=='{' and str[j+1]=='}')
     {
        cout<<"erasing {}"<<endl;
        str.erase(j, 2);
        cout << str << endl;
        countwhile++;
        --j;
     }
     else if(str[j]=='(' and str[j+1]==')')
     {
        cout<<"erasing ()"<<endl;
        str.erase(j, 2);
        cout << str << endl;
        countwhile++;
        --j;
     }
     else if(str[j]=='[' and str[j+1]==']')
     {
        cout<<"erasing []"<<endl;
        str.erase(j, 2);
        cout << str << endl;
        countwhile++;
        --j;
     }
     else
     {
        j++;
     }
     if(countwhile>perlen)
     {
        countwhile=1;
        cout<<"reached break"<<endl;
        break;
     }
  }

为了能够正确地处理像"{[}{]}"这样的输入,你必须对代码进行一些重构,这似乎不是建议对代码进行精心重构以处理这样的输入的正确地方。

cetgtptt

cetgtptt2#

这条线

str.erase(i, 2);

似乎是错误的,因为i不是循环的一部分。i等于str.length();,这导致擦除失败。
你是说

str.erase(j, 2);
tktrz96b

tktrz96b3#

所以应该是这样

while(!str.length()==0 and j+1 < str.length())
            {
                     if(str[j]=='{' and str[j+1]=='}')
                    {
                        str.erase(j, 2);
                        countwhile++;
                        j--;
                    }
                else if(str[j]=='(' and str[j+1]==')')
                    {
                        str.erase(j, 2);
                        countwhile++;
                        j--;
                    }
                else if(str[j]=='[' and str[j+1]==']')
                    {
                        str.erase(j, 2);
                        countwhile++;
                        j--;
                    }
                else
                    {
                        j++;
                    }
                if(countwhile>perlen)
                    {
                        countwhile=1;
                        cout<<"reached break"<<endl;
                    }
                if(countwhile==1)
                    {
                        cout<<"Balanced string "<<str1<<endl;
                        break;
                    }
                else
                    {
                        cout<<"not Balanced "<<str1<<endl;
                        break;
                    }
            }

相关问题