C++:cctype判斷字符

ctype.hC標準函數庫中的頭文件,定義了一批C語言字符分類函數(C character classification functions),用於測試字符是否屬於特定的字符類別,如字母字符、控制字符等等。既支持單字節字符,也支持寬字符

實現

現代的C庫中,字符分類函數一般不用比較測試(comparison tests)實現,而是靜態查表來實現 [1] 。

例如,創建一個由256個8位寬整數組成的數組,每個整數的每位對應字符的特定的分類性質,如屬於數字、屬於字母等等。如果最低位表示屬於數字性質,那麼可以寫成如下代碼:

#define isdigit(x) (TABLE[x] & 1)

早期版本的Linux使用了潛在犯錯的方法,類似於:

#define isdigit(x) ((x) >= '0' && (x) <= '9')

這會產生問題,如宏參數x具有副作用—例如,如果調用isdigit(x++)或isdigit(run_some_program()),可能不是很顯然,isdigit的參數將被求值兩次。所以,查表的方法被廣泛使用。

函數

單字節字符處理函數在ctype.h(C++的cctype)中聲明。寬字節字符處理函數在wctype.h(C++的cwctype)中聲明.

單字節 寬字節 描述
isalnum iswalnum 是否爲字母數字
isalpha iswalpha 是否爲字母
islower iswlower 是否爲小寫字母
isupper iswupper 是否爲大寫字母
isdigit iswdigit 是否爲數字
isxdigit iswxdigit 是否爲16進制數字
iscntrl iswcntrl 是否爲控制字符
isgraph iswgraph 是否爲圖形字符(例如,空格、控制字符都不是)
isspace iswspace 是否爲空格字符(包括製表符、回車符、換行符等)
isblank iswblank 是否爲空白字符(C99/C++11新增)(包括水平製表符)
isprint iswprint 是否爲可打印字符
ispunct iswpunct 是否爲標點
tolower towlower 轉換爲小寫
toupper towupper 轉換爲大寫
不適用 iswctype 檢查一個wchar_t是否是屬於指定的分類
不適用 towctrans 使用指定的變換映射來轉換一個wchar_t(實際上是大小寫的轉換)
不適用 wctype 返回一個寬字符的類別,用於iswctype函數
不適用 wctrans 返回一個變換映射,用於towctrans

字符類

序號 字符類 & 描述
1 數字   完整的數字集合 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
2 十六進制數字   集合 { 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f }
3 小寫字母   集合 { a b c d e f g h i j k l m n o p q r s t u v w x y z }
4 大寫字母   集合 {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }
5 字母   小寫字母和大寫字母的集合
6 字母數字字符   數字、小寫字母和大寫字母的集合
7 標點符號字符   集合 ! " # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
8 圖形字符   字母數字字符和標點符號字符的集合
9 空格字符   製表符、換行符、垂直製表符、換頁符、回車符、空格符的集合。
10 控制字符   在 ASCII 編碼中,這些字符的八進制代碼是從 000 到 037,以及 177(DEL)。
11 空白字符   包括空格符和製表符。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
using namespace std;
int readn()
{
	char c;
	bool f=0;
	int n=0;
	c=getchar();
	while(!isdigit(c))
	{
		if(c=='-')f=1;
		c=getchar();
	}
	do
	{
		n=n*10+(c-'0');
		c=getchar();
	}while(isdigit(c));
	if(f)return -n;
	else return n;
}
string readstr()
{
	char c;
	int k=0;
	char z[200];
	c=getchar();
	while(!isalpha(c)&&!isdigit(c))
	{
		c=getchar();
	}
	do
	{
		z[k]=c;k++;
		c=getchar();
	}while(isalpha(c)||isdigit(c));
	z[k]='\0';
	return z;
}
int main()
{
	string c;
	c=readstr();
	cout<<c<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章