平衡支架C ++无法正常工作,我做错了什么

时间:2016-01-11 07:05:10

标签: c++ string brackets balance

#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 ++的新手,我正在努力学习。

解释

countcp c urly o p zh zh_cn countp为 s quare o 笔括号
圆形开放式支架的国家 countcl用于卷曲关闭或最后一个括号打开括号
方括号的计数器 圆形闭合支架的控制器
例如。输入{()}
    输出平衡
    输入{(} {)}
    输出不均衡  它工作到第30行并且打印相等之后它会给出错误分段错误(核心转储)

3 个答案:

答案 0 :(得分:0)

这一行

i

似乎有误,因为i不是循环的一部分。 str.length();等于str.erase(j, 2); ,导致擦除失败。

你的意思是

If variable1.value = "Yes" then
    Rows("53").Hidden = True
Else
    Rows("53").Hidden = False
End If

答案 1 :(得分:0)

我看到的问题:

  1. main中缺少返回类型。使用:

    int main() ...
    
  2. 访问数组越界。你有:

    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]

  3. 从字符串中删除错误的元素。而不是

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

    使用

    str.erase(j, 2);
    //        ^^
    
  4. 您没有正确更新j的值。说str等于"{()}". When j is equal to 1 , you are trying to remove()from the string. After that, str is equal to&#34; {}&#34;。为了能够对其进行处理,您需要将j的值设置为0。逻辑必须是:

    没有匹配时增加j 匹配时减少j并删除匹配的字符。

  5. 建议改进

    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;
         }
      }
    

    为了能够正确处理"{[}{]}"之类的输入,您必须稍微重新构建代码。这似乎不是建议对代码进行精心重构以便能够处理此类输入的正确位置。

答案 2 :(得分:0)

所以这应该是这样的

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;
                    }
            }