<ctype.h> Phân loại và Chuyển đổi Ký tự| Hàm | Mô tả |
|---|---|
isalnum() |
Kiểm tra ký tự có là chữ cái hoặc chữ số |
isalpha() |
Trả về true nếu ký tự là chữ cái |
isblank() |
Kiểm tra ký tự có là whitespace ngăn từ |
iscntrl() |
Kiểm tra ký tự có là ký tự điều khiển |
isdigit() |
Kiểm tra ký tự có là chữ số |
isgraph() |
Kiểm tra ký tự có in được và không phải space |
islower() |
Kiểm tra ký tự có là chữ thường |
isprint() |
Kiểm tra ký tự có in được |
ispunct() |
Kiểm tra ký tự có là dấu câu |
isspace() |
Kiểm tra ký tự có là whitespace |
isupper() |
Kiểm tra ký tự có là chữ hoa |
isxdigit() |
Kiểm tra ký tự có là chữ số hex |
tolower() |
Chuyển chữ cái sang chữ thường |
toupper() |
Chuyển chữ cái sang chữ hoa |
Bộ macro này tiện để kiểm tra xem một ký tự có thuộc một nhóm nào đó không, chẳng hạn chữ cái, chữ số, ký tự điều khiển, v.v.
Đáng ngạc nhiên là chúng nhận tham số int thay vì kiểu char nào đó. Lý do là để bạn tiện nhét EOF vào nếu có biểu diễn int của nó. Nếu không phải EOF, giá trị truyền vào phải biểu diễn được bằng unsigned char. Ngược lại thì (tèn tèn TÈÈÈN) undefined behavior. Cho nên quên việc nhét ký tự UTF-8 nhiều byte vào đây đi.
Bạn có thể tránh undefined behavior này kiểu portable bằng cách ép kiểu các đối số của những hàm này thành (unsigned char). Công nhận nghe phiền và xấu. Các giá trị trong basic character set đều dùng được an toàn vì chúng là giá trị dương vừa vặn trong unsigned char.
Ngoài ra, hành vi của những hàm này cũng thay đổi theo locale.
Trong nhiều trang ở section này, tôi có kèm vài ví dụ. Chúng chạy ở locale “C”, và có thể khác đi nếu bạn đã đặt locale khác.
Chú ý là ký tự rộng (wide character) có bộ hàm phân loại riêng của nó, nên đừng có thử dùng mấy hàm này trên wchar_t. Nghe không thì biết tay!
isalnum()Kiểm tra ký tự có là chữ cái hoặc chữ số
#include <ctype.h>
int isalnum(int c);Kiểm tra xem ký tự có là chữ cái (A-Z hoặc a-z) hoặc chữ số (0-9).
Tương đương với:
isalpha(c) || isdigit(c)Trả về true nếu ký tự là chữ cái (A-Z hoặc a-z) hoặc chữ số (0-9).
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isalnum('a')? "yes": "no"); // yes
printf("%s\n", isalnum('B')? "yes": "no"); // yes
printf("%s\n", isalnum('5')? "yes": "no"); // yes
printf("%s\n", isalnum('?')? "yes": "no"); // no
}isalpha()Trả về true nếu ký tự là chữ cái
#include <ctype.h>
int isalpha(int c);Trả về true cho các ký tự chữ cái (A-Z hoặc a-z).
Về mặt kỹ thuật (và ở locale “C”) tương đương với:
isupper(c) || islower(c)Cực kỳ siêu kỹ thuật, vì tôi biết bạn đang khát khao đoạn này phức tạp một cách không cần thiết, nó còn có thể bao gồm một số ký tự đặc thù locale mà cái này đúng:
!iscntrl(c) && !isdigit(c) && !ispunct(c) && !isspace(c)và cái này đúng:
isupper(c) || islower(c)Trả về true cho các ký tự chữ cái (A-Z hoặc a-z).
Hoặc bất kỳ thứ điên rồ nào khác trong phần mô tả ở trên.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isalpha('a')? "yes": "no"); // yes
printf("%s\n", isalpha('B')? "yes": "no"); // yes
printf("%s\n", isalpha('5')? "yes": "no"); // no
printf("%s\n", isalpha('?')? "yes": "no"); // no
}isblank()Kiểm tra ký tự có là whitespace ngăn từ
#include <ctype.h>
int isblank(int c);True nếu ký tự là whitespace dùng để ngăn các từ trên cùng một dòng.
Ví dụ, space (' ') hoặc tab ngang ('\t'). Locale khác có thể định nghĩa các ký tự blank khác.
Trả về true nếu ký tự là whitespace dùng để ngăn các từ trên cùng một dòng.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isblank(' ')? "yes": "no"); // yes
printf("%s\n", isblank('\t')? "yes": "no"); // yes
printf("%s\n", isblank('\n')? "yes": "no"); // no
printf("%s\n", isblank('a')? "yes": "no"); // no
printf("%s\n", isblank('?')? "yes": "no"); // no
}iscntrl()Kiểm tra ký tự có là ký tự điều khiển
#include <ctype.h>
int iscntrl(int c);Ký tự điều khiển (control character) là ký tự không in được, tuỳ theo locale.
Với locale “C”, nghĩa là các ký tự điều khiển nằm trong khoảng 0x00 đến 0x1F (ký tự ngay trước SPACE) và 0x7F (ký tự DEL).
Nói chung nếu nó không phải ký tự ASCII (hoặc Unicode nhỏ hơn 128) in được, thì nó là ký tự điều khiển ở locale “C”.
Trả về true nếu c là ký tự điều khiển.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", iscntrl('\t')? "yes": "no"); // yes (tab)
printf("%s\n", iscntrl('\n')? "yes": "no"); // yes (newline)
printf("%s\n", iscntrl('\r')? "yes": "no"); // yes (return)
printf("%s\n", iscntrl('\a')? "yes": "no"); // yes (bell)
printf("%s\n", iscntrl(' ')? "yes": "no"); // no
printf("%s\n", iscntrl('a')? "yes": "no"); // no
printf("%s\n", iscntrl('?')? "yes": "no"); // no
}isdigit()Kiểm tra ký tự có là chữ số
#include <ctype.h>
int isdigit(int c);Kiểm tra xem c có là chữ số trong khoảng 0-9 không.
Trả về true nếu ký tự là chữ số, không có gì bất ngờ.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isdigit('0')? "yes": "no"); // yes
printf("%s\n", isdigit('5')? "yes": "no"); // yes
printf("%s\n", isdigit('a')? "yes": "no"); // no
printf("%s\n", isdigit('B')? "yes": "no"); // no
printf("%s\n", isdigit('?')? "yes": "no"); // no
}isgraph()Kiểm tra ký tự có in được và không phải space
#include <ctype.h>
int isgraph(int c);Kiểm tra xem c có là ký tự in được nào mà không phải space (' ') không.
Trả về true nếu c là ký tự in được nào mà không phải space (' ').
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isgraph('0')? "yes": "no"); // yes
printf("%s\n", isgraph('a')? "yes": "no"); // yes
printf("%s\n", isgraph('B')? "yes": "no"); // yes
printf("%s\n", isgraph('?')? "yes": "no"); // yes
printf("%s\n", isgraph(' ')? "yes": "no"); // no
printf("%s\n", isgraph('\n')? "yes": "no"); // no
}islower()Kiểm tra ký tự có là chữ thường
#include <ctype.h>
int islower(int c);Kiểm tra xem ký tự có là chữ thường trong khoảng a-z không.
Ở các locale khác, có thể có những ký tự chữ thường khác. Trong mọi trường hợp, để là chữ thường, điều sau đây phải đúng:
!iscntrl(c) && !isdigit(c) && !ispunct(c) && !isspace(c)Trả về true nếu ký tự là chữ thường.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", islower('c')? "yes": "no"); // yes
printf("%s\n", islower('0')? "yes": "no"); // no
printf("%s\n", islower('B')? "yes": "no"); // no
printf("%s\n", islower('?')? "yes": "no"); // no
printf("%s\n", islower(' ')? "yes": "no"); // no
}isupper(), isalpha(), toupper(), tolower()
isprint()Kiểm tra ký tự có in được
#include <ctype.h>
int isprint(int c);Kiểm tra xem ký tự có in được không, kể cả space (' '). Nên là giống isgraph(), nhưng lần này space không bị bỏ rơi ngoài trời lạnh.
Trả về true nếu ký tự in được, kể cả space (' ').
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isprint('c')? "yes": "no"); // yes
printf("%s\n", isprint('0')? "yes": "no"); // yes
printf("%s\n", isprint(' ')? "yes": "no"); // yes
printf("%s\n", isprint('\r')? "yes": "no"); // no
}ispunct()Kiểm tra ký tự có là dấu câu
#include <ctype.h>
int ispunct(int c);Kiểm tra xem ký tự có là dấu câu.
Ở locale “C”, điều đó có nghĩa là:
!isspace(c) && !isalnum(c)Ở các locale khác, có thể có các ký tự dấu câu khác (nhưng cũng không thể là space hoặc chữ-số).
True nếu ký tự là dấu câu.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", ispunct(',')? "yes": "no"); // yes
printf("%s\n", ispunct('!')? "yes": "no"); // yes
printf("%s\n", ispunct('c')? "yes": "no"); // no
printf("%s\n", ispunct('0')? "yes": "no"); // no
printf("%s\n", ispunct(' ')? "yes": "no"); // no
printf("%s\n", ispunct('\n')? "yes": "no"); // no
}isspace()Kiểm tra ký tự có là whitespace
#include <ctype.h>
int isspace(int c);Kiểm tra xem c có là ký tự whitespace không. Bao gồm:
' ')'\f')'\n')'\r')'\t')'\v')Các locale khác có thể xác định các ký tự whitespace khác. isalnum() là false với mọi ký tự whitespace.
True nếu ký tự là whitespace.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isspace(' ')? "yes": "no"); // yes
printf("%s\n", isspace('\n')? "yes": "no"); // yes
printf("%s\n", isspace('\t')? "yes": "no"); // yes
printf("%s\n", isspace(',')? "yes": "no"); // no
printf("%s\n", isspace('!')? "yes": "no"); // no
printf("%s\n", isspace('c')? "yes": "no"); // no
}isupper()Kiểm tra ký tự có là chữ hoa
#include <ctype.h>
int isupper(int c);Kiểm tra xem ký tự có là chữ hoa trong khoảng A-Z không.
Ở các locale khác, có thể có những ký tự chữ hoa khác. Trong mọi trường hợp, để là chữ hoa, điều sau đây phải đúng:
!iscntrl(c) && !isdigit(c) && !ispunct(c) && !isspace(c)Trả về true nếu ký tự là chữ hoa.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isupper('B')? "yes": "no"); // yes
printf("%s\n", isupper('c')? "yes": "no"); // no
printf("%s\n", isupper('0')? "yes": "no"); // no
printf("%s\n", isupper('?')? "yes": "no"); // no
printf("%s\n", isupper(' ')? "yes": "no"); // no
}islower(), isalpha(), toupper(), tolower()
isxdigit()Kiểm tra ký tự có là chữ số hex
#include <ctype.h>
int isxdigit(int c);Trả về true nếu ký tự là chữ số hex. Cụ thể là 0-9, a-f, hoặc A-F.
True nếu ký tự là chữ số hex.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// kiểm tra ký tự này
// v
printf("%s\n", isxdigit('B')? "yes": "no"); // yes
printf("%s\n", isxdigit('c')? "yes": "no"); // yes
printf("%s\n", isxdigit('2')? "yes": "no"); // yes
printf("%s\n", isxdigit('G')? "yes": "no"); // no
printf("%s\n", isxdigit('?')? "yes": "no"); // no
}tolower()Chuyển chữ cái sang chữ thường
#include <ctype.h>
int tolower(int c);Nếu ký tự là chữ hoa (tức isupper(c) là true), hàm này trả về chữ thường tương ứng.
Các locale khác nhau có thể có tập chữ hoa và chữ thường khác nhau.
Trả về giá trị chữ thường của một chữ hoa. Nếu ký tự không phải chữ hoa, trả về không đổi.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// đổi ký tự này
// v
printf("%c\n", tolower('B')); // b (đã chuyển thường!)
printf("%c\n", tolower('e')); // e (không đổi)
printf("%c\n", tolower('!')); // ! (không đổi)
}toupper(), islower(), isupper()
toupper()Chuyển chữ cái sang chữ hoa
#include <ctype.h>
int toupper(int c);Nếu ký tự là chữ thường (tức islower(c) là true), hàm này trả về chữ hoa tương ứng.
Các locale khác nhau có thể có tập chữ hoa và chữ thường khác nhau.
Trả về giá trị chữ hoa của một chữ thường. Nếu ký tự không phải chữ thường, trả về không đổi.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// đổi ký tự này
// v
printf("%c\n", toupper('B')); // B (không đổi)
printf("%c\n", toupper('e')); // E (đã chuyển hoa!)
printf("%c\n", toupper('!')); // ! (không đổi)
}tolower(), islower(), isupper()