判断是否合法标识符 acm的一道题
题目是输入一个字符串,判断其是否是C的合法标识符。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。我按以下做法做出来其他结果都正确只是不能判断带有空格...
题目是 输入一个字符串,判断其是否是C的合法标识符。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。
我按以下做法做出来 其他结果都正确 只是不能判断带有空格的字符串
把cin改为getline之后所有的结果全乱套了 哪位高手帮忙看看 是什么问题
有没有办法不改用char 就用string完成这道题的
题目原址http://acm.hdu.edu.cn/showproblem.php?pid=2024
#include <iostream>
#include <string>
using namespace std;
void main()
{
string sys[32] = {"auto", "break", "case", "char", "const", "continue", "default",
"do", "double", "else", "enum", "extern", "float", "for", "goto",
"if", "int", "long", "register", "return", "short", "signed",
"sizeof", "static", "strUCt", "switch", "typedef", "union", "unsigned",
"void", "volatile", "while"};
string x;
int n, j;
bool r;
while (cin >> n)
for (int k = 0; k < n; k++)
{
getline (cin, x);
r = 1;
j = 1;
for (int i = 0; i < 32; i++)
{
if (x == sys[i])
{
r = 0;
break;
}
} //判断是否是系统保留标识符
if (r == 1)
if (!((x[0] >= 'a' && x[0] <= 'z') || (x[0] >= 'A' && x[0] <= 'Z') || x[0] == '_'))
r = 0;//判断首位
while (x[j] && r)
{
if (!((x[j] >= 'a' && x[j] <= 'z') || (x[j] >= 'A' && x[j] <= 'Z') || x[j] == '_' ||
(x[j] >= '0' && x[j] <= '9')))
{
r = 0;
break;
}
j++;
}//逐位检查
if (r == 1)
cout << "yes" << endl;
else
cout << "no" << endl;
}
} 展开
我按以下做法做出来 其他结果都正确 只是不能判断带有空格的字符串
把cin改为getline之后所有的结果全乱套了 哪位高手帮忙看看 是什么问题
有没有办法不改用char 就用string完成这道题的
题目原址http://acm.hdu.edu.cn/showproblem.php?pid=2024
#include <iostream>
#include <string>
using namespace std;
void main()
{
string sys[32] = {"auto", "break", "case", "char", "const", "continue", "default",
"do", "double", "else", "enum", "extern", "float", "for", "goto",
"if", "int", "long", "register", "return", "short", "signed",
"sizeof", "static", "strUCt", "switch", "typedef", "union", "unsigned",
"void", "volatile", "while"};
string x;
int n, j;
bool r;
while (cin >> n)
for (int k = 0; k < n; k++)
{
getline (cin, x);
r = 1;
j = 1;
for (int i = 0; i < 32; i++)
{
if (x == sys[i])
{
r = 0;
break;
}
} //判断是否是系统保留标识符
if (r == 1)
if (!((x[0] >= 'a' && x[0] <= 'z') || (x[0] >= 'A' && x[0] <= 'Z') || x[0] == '_'))
r = 0;//判断首位
while (x[j] && r)
{
if (!((x[j] >= 'a' && x[j] <= 'z') || (x[j] >= 'A' && x[j] <= 'Z') || x[j] == '_' ||
(x[j] >= '0' && x[j] <= '9')))
{
r = 0;
break;
}
j++;
}//逐位检查
if (r == 1)
cout << "yes" << endl;
else
cout << "no" << endl;
}
} 展开
2个回答
展开全部
这道题思路很简单:C语言的 标识符只有三种组成,且数字不能打头,所以详细我就不用 说了,关键是你用cin只能读一部分,他只能读到空格、回车、制表符这三者之一就停止了,什么意思呢?就是说假如有这样的一个测试数据:
1
abcd abcd
对于“abcd abcd”因为中间有一个空格,所以不符合标识符的定义,应该输出no,而你的会输出两个yes,因为你的程序是把“abcd abcd”当作两部分来读的,所以输出两次,如果判你Wrong Answer还好说,要是判你Output limite Excuse你也没什么好说的。
说句题外话,你如果是大一刚来的问这样的问题可以原谅,如果不是的话,你自己应该考虑了是不是该从事acm
1
abcd abcd
对于“abcd abcd”因为中间有一个空格,所以不符合标识符的定义,应该输出no,而你的会输出两个yes,因为你的程序是把“abcd abcd”当作两部分来读的,所以输出两次,如果判你Wrong Answer还好说,要是判你Output limite Excuse你也没什么好说的。
说句题外话,你如果是大一刚来的问这样的问题可以原谅,如果不是的话,你自己应该考虑了是不是该从事acm
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样的 cin的结束是空字符 空格 回车都是
getline只是回车
你再做一下试一试 不行再帮你
还是不行??
你这个题有很多问题,你的代码 致命错误就有2处
逐位检查的循环没有个退出条件,J无限大;
前面的cin getline 没有缓冲区刷新(getline不会主动刷新) 就是说前面那个3 一直都存在缓冲区中,第一次输入无论如何都是no
第3,你的程序根本无法实现题目所给的input output操作
正确的流应该是先根据输入的n 创建N个string 然后再分别对这些string 进行辨认,而你想把他写成一体。
在这里并不能简化程序,并且 你发现没有,你的流,是输入一个cin 就输出一个cout, 根本无法实现输入完毕后一起输出
程序我已经给你改好了,改动有点大,但是还是希望你自己先改一改
getline只是回车
你再做一下试一试 不行再帮你
还是不行??
你这个题有很多问题,你的代码 致命错误就有2处
逐位检查的循环没有个退出条件,J无限大;
前面的cin getline 没有缓冲区刷新(getline不会主动刷新) 就是说前面那个3 一直都存在缓冲区中,第一次输入无论如何都是no
第3,你的程序根本无法实现题目所给的input output操作
正确的流应该是先根据输入的n 创建N个string 然后再分别对这些string 进行辨认,而你想把他写成一体。
在这里并不能简化程序,并且 你发现没有,你的流,是输入一个cin 就输出一个cout, 根本无法实现输入完毕后一起输出
程序我已经给你改好了,改动有点大,但是还是希望你自己先改一改
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询