PAT 乙级 1003. 我要通过!(20) 测试点2运行时错误 求解

qq_34627368 2019-02-17 03:41:58
1003 我要通过! (20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。

输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:
YES
YES
YES
YES
NO
NO
NO
NO


#include <iostream>
#include <cstdlib>
#include <cstring>
int main()
{
int n;
scanf("%d", &n);
char pStr[9][101];
for (size_t i = 0; i < n; i++)
{
scanf("%s", pStr[i]);
}
for (size_t i = 0; i < n; i++)
{
bool flag = true;
char *pOfP = strchr(pStr[i], 'P');
char *pOfT = strchr(pStr[i], 'T');
char *pOfEnd;
if (!pOfP || !pOfT)
{
flag = false;
}
if (flag)
{
//保存尾指针
for (pOfEnd = pStr[i]; *pOfEnd != '\0'; pOfEnd++);
char a[101] = { '\0' };
char b[101] = { '\0' };
char c[101] = { '\0' };
//保存a,b,c长度的长度
int na = (pOfP - 1) - pStr[i] + 1;
int nb = (pOfT - 1) - (pOfP + 1) + 1;
int nc = (pOfEnd - 1) - (pOfT + 1) + 1;
//判断nb>0
if (nb < 1)
{
flag = false;

}
//判断nc=na*nb
if (nc != na*nb)
{
flag = false;
}
//保存a,b,c
strncpy(a, pStr[i], na);
strncpy(b, pOfP + 1, nb);
strncpy(c, pOfT + 1, nc);
//判断a是不是全A
if (flag)
{
for (size_t j = 0; j < na; j++)
{
if (*(pStr[i] + j) != 'A')
{
flag = false;
break;
}
}
}
//判断b是不是全A
if (flag)
{
for (size_t j = 0; j < nb; j++)
{
if (*(pOfP + 1 + j) != 'A')
{
flag = false;
break;
}
}
}
//判断c是不是全A
if (flag)
{
for (size_t j = 0; j < nc; j++)
{
if (*(pOfT + 1 + j) != 'A')
{
flag = false;
break;
}
}
}
}
//打印结果
if (flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
system("pause");
return 0;
}


去查了代码,这个思路没错,但测试点2过不了,而且结果是运行时错误,去看了官方常见问题解答也没有运行时错误的解释,求解答。
...全文
650 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Raccoonnn 2019-02-20
  • 打赏
  • 举报
回复
第二个测试点应该测试的是“PA”,你看看你的代码对“PA”测试结果对不对把
qq_34627368 2019-02-18
  • 打赏
  • 举报
回复
引用 2 楼 或✘许✔吧 的回复:
这个不可以输入一个就输出结果吗
难道一定要输入全部的再按顺序输出结果?
感觉用指针还麻烦一点,直接用整型变量进行标记就好

输入一个输出一个我试过结果输出格式是:
PAT
YES
PAAT
YES
AAPATAA
YES
AAPAATAAAA
YES
xPATx
NO
PT
NO
Whatever
NO
APAAATAA
NO

还有第二个问题是因为strchr函数的返回值就是指针哈,然后考虑到下面的strncpy参数也是指针,所以才没有把指针相减用整形变量标记的。

不过这个问题用c++的封装类型能解决,唯一不明白的是用C的话,结果给了个运行时错误也不告诉什么错误,测试点的数据也不知道... ...
名字在哪啊 2019-02-18
  • 打赏
  • 举报
回复
for (pOfEnd = pStr[i]; *pOfEnd != '\0'; pOfEnd++);
char a[101] = { '\0' };
char b[101] = { '\0' };
char c[101] = { '\0' };感觉这里有点问题
qq_34627368 2019-02-18
  • 打赏
  • 举报
回复
引用 4 楼 或✘许✔吧 的回复:
for (pOfEnd = pStr[i]; *pOfEnd != '\0'; pOfEnd++);
char a[101] = { '\0' };
char b[101] = { '\0' };
char c[101] = { '\0' };感觉这里有点问题

for (pOfEnd = pStr[i]; *pOfEnd != '\0'; pOfEnd++); //找到字符串结束指针
char a[101] = { '\0' };
char b[101] = { '\0' };
char c[101] = { '\0' };
初始化a,b,c为空字符串,否则PAT这种情况的时候a="",b="A",c="",但是字符串a,c由于没有初始化为空字符串,所以读取出错。
名字在哪啊 2019-02-17
  • 打赏
  • 举报
回复
这个不可以输入一个就输出结果吗
难道一定要输入全部的再按顺序输出结果?
感觉用指针还麻烦一点,直接用整型变量进行标记就好
qq_34627368 2019-02-17
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main()
{
size_t n;
cin >> n;
string str[9];
for (size_t i = 0; i < n; i++)
{
cin >> str[i];
}
for (size_t i = 0; i < n; i++)
{
bool flag = true;
size_t posOfP = str[i].find("P");
size_t posOfT = str[i].find("T");
if (-1 == posOfP || -1 == posOfT)
{
flag = false;
}
if (flag)
{
//保存a,b,c的长度
int na = posOfP;
int nb = (posOfT - 1) - (posOfP + 1) + 1;
int nc = (str[i].length() - 1) - (posOfT + 1) + 1;
//判断nb>0
if (nb < 1)
{
flag = false;

}
//判断nc=na*nb
if (nc != na*nb)
{
flag = false;
}
//保存a,b,c
string a = str[i].substr(0, na);
string b = str[i].substr(posOfP + 1, nb);
string c = str[i].substr(posOfT + 1, nc);
//判断a是不是全A
if (flag)
{
for (size_t j = 0; j < na; j++)
{
if (a[j] != 'A')
{
flag = false;
break;
}
}
}
//判断b是不是全A
if (flag)
{
for (size_t j = 0; j < nb; j++)
{
if (b[j] != 'A')
{
flag = false;
break;
}
}
}
//判断c是不是全A
if (flag)
{
for (size_t j = 0; j < nc; j++)
{
if (c[j] != 'A')
{
flag = false;
break;
}
}
}
}
//打印结果
if (flag)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
system("pause");
return 0;
}

换成C++的字符串解决了... ...

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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