ctype.h是C標準函數庫中的頭文件,定義了一批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;
}