类别有十进制整数,浮点数(带科学计数法表示的),c语言保留字(可能不完整,思路),标识符,不合法的内容
标识符和关键字
首先是标识符和关键字归于一类,然后是数
标识符的满足条件,首字符不是数字,所有字符都选自a-z,A-Z,0-9,_这四类中。因此构造集合,先对首字符进行判断,然后判断其余字符是否属于该集合即可。对于其中保留字的部分,单独构造一个集合,里面是保留字的字符串,进行一次判断即可。
IsInStration判断的是string每个字符均属于a-z,A-Z,0-9,_这四类中
IsReserved判断的是srting是否是c保留字
if(s[0]=='_'){
if(IsInStration(s.substr(1))){
cout<<"标识符"<<endl;
}
}
else if((s[0]<='z'&&s[0]>='a')||(s[0]<='Z'&&s[0]>='A')){
if(IsReserved(s)){
cout<<"保留字"<<endl;
}
else if(IsInStration(s)){
cout<<"标识符"<<endl;
}
}
浮点数
然后对浮点数进行判断,先查看该字串是否有点,举几个浮点数的表示方法,0.6,.6(小数点前后如果是0可以省略),6.0,6.,2.3e2,2.3e+2, 2.3e-2
从这几个数中我们可以发现,必然会有小数点,所以我们先查看该字串是否有小数点,有的才进行该次判断。
先对一般情况(非科学计数法)作判断,用小数点做划分依据,小数点之前是整数(跟下面的整数判断规则类似),小数点之后是可以有前导0的整数(如1.00002的00002),这种形式即为浮点数。
随后对科学计数法的情况,我们可以发现,e之前,就直接用上面的一般情况的判断,小数点之后,就是可能带符号的整数(不能有前导0的)。这样划分完,就可以对浮点数进行判断了。
else if(std::count(s.begin(),s.end(),'.')==1){
if(IsFloat(s)){
cout<<"浮点数"<<endl;
}
else cout<<"不合法的内容"<<endl;
}
bool IsFloatWithoutE(string s){
int pos = s.find('.');
string s1 = s.substr(0,pos);
string s2 = s.substr(pos+1);
if(s1[0]=='0'&&s1.length()!=1) return 0;
if(IsNumber(s1)&&IsNumber(s2)) return 1;
}
bool IsFloat( string s){
if(std::count(s.begin(),s.end(),'e')==0){
return IsFloatWithoutE(s);
}
if(std::count(s.begin(),s.end(),'e')==1){
int posT = s.find('e');
string s1T = s.substr(0,posT);
string s2T = s.substr(posT+1);
if((s2T[0]=='0'&&s2T.length()==1)||(s2T[0]=='-'&&IsNumber(s2T.substr(1)))||(s2T[0]=='+'&&IsNumber(s2T.substr(1)))||(s2T[0]!='0'&&IsNumber(s2T))){
if(IsFloatWithoutE(s1T)) return true;
}
}
return false;
}
十进制整数
最后对十进制整数进行判断,分为两类
首字符是0,字串长度为1
首字符非0,其余字符选自0-9
如果首字符是正负号,则对string.substr(1)进行上述判断
else if((s[0]=='0'&&s.length()==1)||(s[0]=='-'&&IsNumber(s.substr(1)))||(s[0]=='+'&&IsNumber(s.substr(1)))||(s[0]!='0'&&IsNumber(s))){
cout<<"十进制整数"<<endl;
}
代码附下(考虑不周之处欢迎指正)
#include<iostream>
#include<string>
#include <set>
#include <algorithm>
using namespace std;
std::set<char> myChar;
std::set<char> myNumber;
bool IsReserved(string s){
std::set<string> reservedSet;
reservedSet.insert("auto");
reservedSet.insert("bool");
reservedSet.insert("break");
reservedSet.insert("case");
reservedSet.insert("char");
reservedSet.insert("class");
reservedSet.insert("const");
reservedSet.insert("continue");
reservedSet.insert("default");
reservedSet.insert("delete");
reservedSet.insert("do");
reservedSet.insert("double");
reservedSet.insert("else");
reservedSet.insert("enum");
reservedSet.insert("extern");
reservedSet.insert("float");
reservedSet.insert("for");
reservedSet.insert("goto");
reservedSet.insert("if");
reservedSet.insert("inline");
reservedSet.insert("int");
reservedSet.insert("long");
reservedSet.insert("new");
reservedSet.insert("return");
reservedSet.insert("short");
reservedSet.insert("signed");
reservedSet.insert("sizeof");
reservedSet.insert("static");
reservedSet.insert("switch");
reservedSet.insert("unsigned");
reservedSet.insert("while");
reservedSet.insert("void");
reservedSet.insert("union");
if(reservedSet.find(s)!=reservedSet.end()){
return 1;
}else return 0;
}
bool IsInStration(string s){
for(int i=0;i<s.length();i++){
if(myChar.find(s[i])==myChar.end()){
cout<<"不合法的内容"<<endl;
return 0;
}
}
return 1;
}
bool IsNumber(string s){
for(int i=0;i<s.length();i++){
if(myNumber.find(s[i])==myNumber.end()){
cout<<"不合法的内容"<<endl;
return 0;
}
}
return 1;
}
bool IsFloatWithoutE(string s){
int pos = s.find('.');
string s1 = s.substr(0,pos);
string s2 = s.substr(pos+1);
if(s1[0]=='0'&&s1.length()!=1) return 0;
if(IsNumber(s1)&&IsNumber(s2)) return 1;
}
bool IsFloat( string s){
if(std::count(s.begin(),s.end(),'e')==0){
return IsFloatWithoutE(s);
}
if(std::count(s.begin(),s.end(),'e')==1){
int posT = s.find('e');
string s1T = s.substr(0,posT);
string s2T = s.substr(posT+1);
if((s2T[0]=='0'&&s2T.length()==1)||(s2T[0]=='-'&&IsNumber(s2T.substr(1)))||(s2T[0]=='+'&&IsNumber(s2T.substr(1)))||(s2T[0]!='0'&&IsNumber(s2T))){
if(IsFloatWithoutE(s1T)) return true;
}
}
return false;
}
int main(){
string s;
for(char a = 'a';a<='z';a++){
myChar.insert(a);
myChar.insert(a-32);
}
for(char a='0';a<='9';a++){
myChar.insert(a);
myNumber.insert(a);
}
myChar.insert('_');
while(cin>>s){
//if the first char is _,and the rest of string is allowed,is biaoshifu
if(s[0]=='_'){
if(IsInStration(s.substr(1))){
cout<<"标识符"<<endl;
}
}
else if((s[0]<='z'&&s[0]>='a')||(s[0]<='Z'&&s[0]>='A')){
if(IsReserved(s)){
cout<<"保留字"<<endl;
}
else if(IsInStration(s)){
cout<<"标识符"<<endl;
}
}
else if(std::count(s.begin(),s.end(),'.')==1){
if(IsFloat(s)){
cout<<"浮点数"<<endl;
}
else cout<<"不合法的内容"<<endl;
}
else if((s[0]=='0'&&s.length()==1)||(s[0]=='-'&&IsNumber(s.substr(1)))||(s[0]=='+'&&IsNumber(s.substr(1)))||(s[0]!='0'&&IsNumber(s))){
cout<<"十进制整数"<<endl;
}
}
}
文章讲述了C语言中如何判断标识符、保留字以及不同类型的数值(十进制整数、浮点数),包括检查字符串是否符合C语言的字符集规则和科学计数法表示。

1万+

被折叠的 条评论
为什么被折叠?



