判断字符串类型

文章讲述了C语言中如何判断标识符、保留字以及不同类型的数值(十进制整数、浮点数),包括检查字符串是否符合C语言的字符集规则和科学计数法表示。

类别有十进制整数,浮点数(带科学计数法表示的),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;
    }
    

    

  }

  



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值