Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 平衡支架C和x2B+;不工作,我做错了什么 #包括 #包括 使用名称空间std; main() { int i,j=0,perlen,countcp=0,countsp=0,countrp=0,countcl=0,countsl=0,countrl=0; str序列,str1; 不能_C++_String_Brackets_Balance - Fatal编程技术网

C++ 平衡支架C和x2B+;不工作,我做错了什么 #包括 #包括 使用名称空间std; main() { int i,j=0,perlen,countcp=0,countsp=0,countrp=0,countcl=0,countsl=0,countrl=0; str序列,str1; 不能

C++ 平衡支架C和x2B+;不工作,我做错了什么 #包括 #包括 使用名称空间std; main() { int i,j=0,perlen,countcp=0,countsp=0,countrp=0,countcl=0,countsl=0,countrl=0; str序列,str1; 不能,c++,string,brackets,balance,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;

这条线

#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;
        }
    }
}
似乎是错误的,因为
i
不是循环的一部分。
i
等于
str.length();
,这会导致擦除失败

你是说

str.erase(i, 2);
我看到的问题:

  • main
    中缺少返回类型。请使用:

    str.erase(j, 2);
    
  • 访问数组超出范围。您有:

    int main() ...
    
    这还不够。您还需要确保访问
    str
    时不会超出范围。因此,请将其更改为:

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

  • 您没有正确更新
    j
    的值。假设
    str
    等于
    “{()}”。当
    j
    等于
    1
    时,您试图从字符串中删除
    ()
    。之后,
    str
    等于
    “{}”。为了能够处理该问题,您需要将
    j
    的值设置为
    0
    。逻辑需要为:

    当没有匹配项时,增量
    j

    当存在匹配且删除匹配字符时,减量
    j

  • 改进建议

    i
    j
    使用无符号类型以避免编译器警告

    您可以使用:

    str.erase(j, 2);
    //        ^^
    
    更新版本的
    ,同时使用上述修复循环

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

    std::string::size_type i = 0;
    std::string::size_type j = 0;
    
    int countwhile=0;
    std::string::size_type j=0;
    而(!str.length()==0&&j+1所以这段时间应该是这样的

      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;
         }
      }
    
    while(!str.length()==0和j+1perlen)
    {
    countwhile=1;
    
    coutExplain失败的情况您应该使用调试器检查代码并逐行检查代码。这可能比在这里问一个不清楚的问题更有效。您只检查
    str[j]
    str[j+1]
    。我建议更好地使用堆栈处理此que。您的while条件永远不会变为零。是的,我的意思是j thnx寻求帮助,但现在我在抛出“std::out\u of_range”what()实例后调用了一个错误terminate:基本\u字符串::擦除已中止(内核转储)我想你需要在每次擦除后将
    j
    设置回零。或者可能将其设置为
    -1
    ,因为你以后有一个
    j++
    。这个想法必须是在每次擦除匹配对时重新开始。是的,这是我忘记将j设置为零的问题。现在它正在工作,非常感谢你现在它工作。我仍在测试它是否工作正常在对({})进行了所有编辑之后,它对({})有效,但对({{}})无效.@Dementor,你需要使用不同的策略和算法来处理这些输入。在更新程序之前,你必须花一些时间用铅笔和纸处理这些输入。@R Sahu,我正在匹配相邻的括号。为什么failing@Dementor不,你不是。仔细看。
    str.erase(j, 2);
    //        ^^
    
    std::string::size_type i = 0;
    std::string::size_type j = 0;
    
      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;
         }
      }
    
    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;
                        }
                }