C++细节(二):区分数据的类型

来源:互联网 发布:中金交易软件 编辑:程序博客网 时间:2024/06/03 17:15

  当时遇到一道判断字符串中数字与字符数量的题,虽然当时是用if((c >= 'a' && a <= 'z' ) || (c >= 'A' && c <= 'Z')) ...和if(c >= '0' && c <= '9') ...的方法解决了问题,但这个方法确实有点笨,后来了解了一些字符检测函数,十分好用,在这里分享给大家:

isdigit(c)     c为数字式返回真

isalpha(c)   c为字母时返回真

isalnum(c)  c为字符或数字时返回真

islower(c)   c为小写字母时返回真

isupper(c)   c为大写字母时返回真

isspace(c)   c为空白符时返回真

isprint(c)      c为可打印字符(包括空格‘ ’)时返回真

isgraph(c)    c为可打印字符(不包括空格‘ ’)时返回真

ispunct(c)    c为出数字、字母、空格之外的可打印字符时返回真

iscntrl(c)      c为控制字符(如'\n’、'\f'、‘\v’、‘\a’、‘\b’等)时返回真

  这些函数都包含在<ctype>中。

  虽然这些函数已经够便利了,但在应用中仍是不足的。比如,我想区分一个数,它是int型还是float型亦或是char型。这时该怎么办呢?以上的函数无法完全解决这个问题。这时,我了解到C++中有一个标识符叫typeid,它包含在<typeinfo>中,我来为大家说明一下用法,如下代码:

int a;

cout << typeid(a).name() << endl;

这时会打印出 i 这个字母,即int的第一个字母,同理,如果是float型的数据的话,会打印出 f ,以下是我的总结:

数据类型          输出字母

int                      i

float                   f

char                  c

long                   l

string                Ss

double               d

long double       e

short                 s

char*                Pc(pointer char)

int*                    Pi(pointer int)

bool                   b

类的typeid(class).name()会随着类的名字和名字的字数发生改变。如:

class M{};

class MN{};

typeid(M).name()输出的结果为  1M ,而typeid(MN).name()输出的结果为  2MN。结构体、枚举和联合体的输出结果与类相同。当然这个标识符对于函数也适用,void类型的函数输出为  FvvE,int类型的函数为  FivE,不同类型的函数输出的值会如上改变,‘F’、‘v’、‘E’不会变,但是有两种函数不一样,构造函数会输出和类一样的值,析构函数则不能使用这个标识符,否则会报错。

其他的指针、向量、bitset之类的输出结果我就不一一累述了。

如果想用if语句来判断数据类型,则应这样写:

int a;

if(*typeid(a).name() == 'i')cout << "Hello" << endl;

else cout << "World" << endl;

这里会在控制台输出 Hello。


以上是在Codeblocks开发环境下的结果,如果是在Visual Studio的开发环境下

int a;

cout << typeid(a).name() << endl;

输出的结果将会是 int,char型的变量会输出char ,float型的变量会输出float,以此类推。

(请注意:typeid().name()这个函数返回的是一个const char*类型的值)


以上为全部内容,希望大家多多支持!

原创粉丝点击