#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行,并打印相等,之后它给出错误分段错误(核心转储)
3条答案
按热度按时间t8e9dugd1#
我看到的问题:
main
中缺少返回类型。请使用:1.访问数组越界。您有:
这是不够的,你还需要确保你不会访问
str
超出范围,因此,将其更改为:或者更好的是
使用
j+1
是必要的,因为您要在循环中访问str[j+1]
。1.从字符串中擦 debugging 误的元素。
使用
1.您没有正确更新
j
的值。假设str
等于"{()}". When
jis equal to
1, you are trying to remove
()from the string. After that,
stris equal to
"{}"。为了能够处理该问题,您需要将j
的值设置为0
。逻辑需要为:当不存在匹配时,递增
j
。当存在匹配项时,
j
递减,匹配的字符将被删除。对
i
和j
使用无符号类型以避免编译器警告。您可以使用:
while
循环的更新版本,包含上述修复**我还添加了额外的
cout
行来帮助诊断逻辑错误。为了能够正确地处理像
"{[}{]}"
这样的输入,你必须对代码进行一些重构,这似乎不是建议对代码进行精心重构以处理这样的输入的正确地方。cetgtptt2#
这条线
似乎是错误的,因为
i
不是循环的一部分。i
等于str.length();
,这导致擦除失败。你是说
tktrz96b3#
所以应该是这样