pat 这题有一个小节段错误,求大神指点

gate3img 2018-03-15 09:53:12
#include<iostream>
#include<string>
using namespace std;
main()
{
string s;
int n,i,k,a1,a2,a3;
int f,b1,b2,b3,j;
cin>>n;
while(n--)
{
b1=b2=b3=a1=a2=a3=0;
f=0;
cin>>s;
for(i=0;i<s.length();i++)
{
if(s[i]=='A')
b1++;
else if(s[i]=='P')
b2++;
else if(s[i]=='T')
b3++;
}
if(b1==0||b2==0||b3==0)
f=2;
if(f!=2)
for(i=0;i<s.length();i++)
{
if(s[i]!='P'&&s[i]!='A'&&s[i]!='T')
{
f=2;
break;
}
if(s[i]=='P'&&s[i+1]=='A'&&s[i+2]=='T')
{
f=1;
break;
}
else
{
f=0;
break;
}
}
if(f==0)
{
i=0;
while(i!=s.length())
{
while(s[i]!='P')
{
a1++;
i++;
}
i++;
while(s[i]!='T')
{
a2++;
i++;
}
i++;
while(i!=s.length())
{
a3++;
i++;
}
}
//cout<<a1<<" "<<a2<<" "<<a3<<endl;
if(a1*a2==a3)
f=1;
}
if(f==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;

}
}




https://www.patest.cn/contests/pat-b-practise/1003
...全文
253 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
flyunlike 2018-03-16
  • 打赏
  • 举报
回复
还有。。。这道题具体说的是什么,感觉你后面的代码怪怪的。。。
flyunlike 2018-03-16
  • 打赏
  • 举报
回复
调试看了一下,在下面的循环当中,发生了越界现象, while(i!=s.length()) { while(s[i]!='P') { a1++; i++; } i++; while(s[i]!='T') { a2++; i++; } i++; while(i!=s.length()) { a3++; i++; } } i在满足while(i!=s.length())的内循环中超出范围,而没有语句进行检测,导致指针越界

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧