Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm isalpha() và isdigit() trong C/C++

Hai hàm phân loại ký tự quan trọng trong <ctype.h> (C) / <cctype> (C++).

isalpha() - Kiểm tra chữ cái

  • Trả về khác 0 (true) nếu ký tự là chữ cái (A-Z, a-z)
  • Trả về 0 nếu không phải
  • Phụ thuộc locale (locale "C" chỉ ASCII)

Cú pháp

int isalpha(int ch);

Tham số: int (ký tự ép sang unsigned char hoặc EOF)

Ví dụ

#include <stdio.h>
#include <ctype.h>

int main() {
    char c1 = 's', c2 = '8', c3 = '@';
    
    printf("'%c': %s\n", c1, isalpha(c1) ? "alphabet" : "not alphabet");
    printf("'%c': %s\n", c2, isalpha(c2) ? "alphabet" : "not alphabet");
    printf("'%c': %s\n", c3, isalpha(c3) ? "alphabet" : "not alphabet");
    
    return 0;
}

Kết quả

's': alphabet
'8': not alphabet
'@': not alphabet

isdigit() - Kiểm tra chữ số

  • Trả về khác 0 nếu ký tự là '0'..'9'
  • Trả về 0 nếu không phải

Cú pháp

int isdigit(int ch);

Ví dụ

#include <stdio.h>
#include <ctype.h>

int main() {
    char c1 = 's', c2 = '8';
    
    printf("'%c': %s\n", c1, isdigit(c1) ? "digit" : "not digit");
    printf("'%c': %s\n", c2, isdigit(c2) ? "digit" : "not digit");
    
    return 0;
}

Kết quả

's': not digit
'8': digit

Hàm liên quan trong ctype.h

Chuyển đổi chữ hoa/thường

HàmKiểm traASCII range
isalphaChữ cáiA-Z, a-z
isdigitChữ số0-9
isalnumChữ cái hoặc sốA-Z, a-z, 0-9
islowerChữ thườnga-z
isupperChữ hoaA-Z
isspaceWhitespacespace, \t, \n, \v, \f, \r
ispunctDấu câu!@#$%^&*()...
isxdigitHex digit0-9, A-F, a-f
isprintIn đượcSpace đến ~
iscntrlControl char0-31, 127
isgraphIn được trừ space! đến ~

Lưu ý QUAN TRỌNG: Cast unsigned char

// SAI - UB nếu char signed và giá trị > 127
char c = getchar();
if (isalpha(c)) ... 

// ĐÚNG - Ép sang unsigned char trước
char c = getchar();
if (isalpha((unsigned char)c)) ...

// Hoặc dùng int để nhận EOF
int ch = getchar();
if (ch != EOF && isalpha(ch)) ...

Lý do: ctype.h functions yêu cầu tham số là unsigned char hoặc EOF. Trên hệ thống char signed, ký tự extended ASCII (128-255) thành âm → UB.

C++: Locale-aware versions

#include <locale>
#include <iostream>

int main() {
    char c = 'é';
    std::locale loc("");
    
    // C locale (chỉ ASCII)
    std::cout << std::isalpha(c, std::locale::classic()) << '\n'; // 0
    
    // User locale (hệ thống)
    std::cout << std::isalpha(c, loc) << '\n'; // 1 (nếu locale hỗ trợ)
    
    return 0;
}

Best Practice

  • Luôn cast (unsigned char) khi dùng isalpha/isdigit/... với char
  • Dùng int variable để nhận getchar()/fgetc() (có thể là EOF)
  • C++: ưu tiên overload có std::locale cho Unicode support
  • Unicode đầy đủ: dùng ICU hoặc C++26 <text>
HàmMô tả
toupper(ch)Chuyển thành chữ hoa
tolower(ch)Chuyển thành chữ thường