一、题目要求
最近刚开始学C++,读到这么一句:“标识符由字母或数字或下划线构成,但首字符不能是数字”。标识符(identifier)就是变量、函数、类等各种名字。这和上学期的Java也差不多,估计老师还会出一堆标识符有效性的判断题。“懒惰是程序员的美德”,这次我要写个程序来判断,学编程不就为把工作推给电脑嘛。身为初学者,咱就不考虑$
或非ASCII字符之类的扩展了,也不用考虑是否关键字。另外听说C++对判断大小写、字母、数字都有库函数可用,比如isdigit()
之类,搜搜用法即可,不必劳我大驾亲写。
输入规格
每行一个待判断的字符串。按行读取。处理到数据结束(EOF)为止。
代码结构参考:for(string s; getline(cin, s);){ ... }
说明:这里用的getline()
是标准库的自由函数,而不是cin.getline()
成员函数。
输出规格
每行一个判断结果。如符合标识符格式输出1、否则输出0。
样例输入
abc
123
样例输出
1
0
样例解释
第1行abc
可以作标识符,第2行123
则不行。测试点肯定比这复杂。
代码长度限制
1 KB
时间限制
1000 ms
内存限制
16 MB
栈限制
8192 KB
二、前置知识
1、逐行读取输入端字符串数据,直到下一行没有为止
string s;
while(getline(cin,s)){
}
2、将字符串的每一个字符逐个分离成字符然后逐个判断需要用到for循环和字符串的一个s.at()函数取第x个就s.at(x),x从0开始取(因为for循环中的i从0开始)
for(int i=0;i<s.length();i++){
char c=s.at(i);
3、isForm()函数中,只要是不符合标识符命名需求的直接退出循环return 0,其余的情况就是为符合要求的在最后return 1即可
int isForm(string s){
char c0=s.at(0);
if(c0>='0'&&c0<='9'){
return 0;//刚开始对第一个字符判断是否为数字,如果是数字则不符合标识符要求直接return 0
}
for(int i=0;i<s.length();i++){
char c=s.at(i);
if((c<'a'||c>'z')&&(c<'A'||c>'Z')&&(c<'0'||c>'9')&&(c!='_')){
//如果for循环中开始出现第一个字符c既不是大小写字母也不是数字和下划线,则后面的不需要判断了直接返回0
return 0;
}
}
return 1;
三、完整C++代码实现
#include<iostream>
using namespace std;
int isForm(string);
int main(){
string s;
while(getline(cin,s)){
cout<<isForm(s)<<endl;
}
return 0;
}
int isForm(string s){
char c0=s.at(0);
if(c0>='0'&&c0<='9'){
return 0;
}
for(int i=0;i<s.length();i++){
char c=s.at(i);
if((c<'a'||c>'z')&&(c<'A'||c>'Z')&&(c<'0'||c>'9')&&(c!='_')){
return 0;
}
}
return 1;
}