目录
标识符
题目描述
在 C++ 中,标识符是用于标识某个实体的“名字”。这里,我们定义标识符是满足以下条件的非空字符串:
- 串长 ≤32;
- 仅由数字 0 到 9、大写字母 A 到 Z、小写字母 a 到 z、下划线 __、美金符号 $ 组成;
- 第一个字符不是数字。
给定若干字符串,一行一个,要求分别判断它们是否是满足条件的标识符。
请注意,请不要混淆标识符和 C++ 中变量的定义,例如有以下区别:
- 以 * 开头(指针),结尾有 [](数组)等情况均不属于标识符,输入中多次出现同样的字符串不需要额外判断重名。
- 本题的定义中,不允许标识符中出现转义符 \。
- C++ 关键字等也属于标识符。
- 其他与 C++ Standard 冲突的事项在本题中均以上述定义为准,例如不同的编译器对串长的限制可能不同。
输入格式
第一行一个数 T,表示需要判断的组数。
接下来每行一个串 S。注意,所在行的换行不是 S 的一部分。
输入满足一行一串,不存在额外的空行(除了文件末尾)。
输出格式
输出 T 行。每行输出 OK
或 CE
,分别表示合法或不合法。
样例输入
6
int
_123_
0xFF
_
Hello World
\u4f60\u53d1\u73b0\u4e86\u5f69\u86cb\uff01
样例输出
OK
OK
CE
OK
CE
CE
数据范围
令 |S| 表示字符串 S 的长度。
对于前 30% 的数据,|S|=1。
对于前 60% 的数据,S 非空且仅由数字和大小写字母组成。
对于前 80% 的数据,S 中无空格。
对于 100% 的数据,1≤T≤10,0≤|S|,∑|S|≤1000。
保证 S 由可打印 ASCII 字符(ASCII 码范围 32∼126)组成。比如,S 中不会出现换行、制表符或汉字。
时间限制:1s;空间限制:64MB。
提示
请仔细读题,注意特殊边界情况。
代码
#include<iostream>
#include<cstring>
using namespace std;
char a[1005];
int check(char m[]){
if(strlen(m)>32||strlen(m)==0) return 0;
int n=strlen(m);
for(int i=0;i<n;i++){
if(!((m[i]>='0'&&m[i]<='9')||(m[i]>='a'&&m[i]<='z')||(m[i]>='A'&&m[i]<='Z')||m[i]=='$'||m[i]=='_'))
return 0;
else if(m[i]=='\\')
return 0;
}
if(m[0]>='0'&&m[0]<='9') return 0;
return 1;
}
int main(){
int n;
cin>>n;
getchar();
for(int i=0;i<n;i++){
gets(a);
if(check(a)) cout<<"OK"<<endl;
else cout<<"CE"<<endl;
}
return 0;
}