判断是否合法标识符 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;

}
}
展开
 我来答
sunshine_0316
2009-01-21 · 超过17用户采纳过TA的回答
知道答主
回答量:28
采纳率:0%
帮助的人:0
展开全部
这道题思路很简单:C语言的 标识符只有三种组成,且数字不能打头,所以详细我就不用 说了,关键是你用cin只能读一部分,他只能读到空格、回车、制表符这三者之一就停止了,什么意思呢?就是说假如有这样的一个测试数据:
1
abcd abcd
对于“abcd abcd”因为中间有一个空格,所以不符合标识符的定义,应该输出no,而你的会输出两个yes,因为你的程序是把“abcd abcd”当作两部分来读的,所以输出两次,如果判你Wrong Answer还好说,要是判你Output limite Excuse你也没什么好说的。

说句题外话,你如果是大一刚来的问这样的问题可以原谅,如果不是的话,你自己应该考虑了是不是该从事acm
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
牛比的琭琭
2009-01-21 · TA获得超过685个赞
知道小有建树答主
回答量:588
采纳率:0%
帮助的人:429万
展开全部
这样的 cin的结束是空字符 空格 回车都是
getline只是回车

你再做一下试一试 不行再帮你

还是不行??

你这个题有很多问题,你的代码 致命错误就有2处
逐位检查的循环没有个退出条件,J无限大;
前面的cin getline 没有缓冲区刷新(getline不会主动刷新) 就是说前面那个3 一直都存在缓冲区中,第一次输入无论如何都是no

第3,你的程序根本无法实现题目所给的input output操作
正确的流应该是先根据输入的n 创建N个string 然后再分别对这些string 进行辨认,而你想把他写成一体。
在这里并不能简化程序,并且 你发现没有,你的流,是输入一个cin 就输出一个cout, 根本无法实现输入完毕后一起输出

程序我已经给你改好了,改动有点大,但是还是希望你自己先改一改
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式