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

Toán học ký tự (Character arithmetic) trong C

Trong C, kiểu char bản chất là số nguyên nhỏ (thường 8-bit). Khi thực hiện phép toán, char tự động chuyển thành int (integer promotion) theo mã ASCII.

Ví dụ minh họa

#include <stdio.h>

int main() {
    char s = 'm';        // ASCII 109
    char t = 'z' - 'y';  // 122 - 121 = 1
    
    printf("s = %d (char: %c)\n", s, s);     // 109, m
    printf("s+1 = %d (char: %c)\n", s+1, s+1); // 110, n
    printf("s-1 = %d (char: %c)\n", s-1, s-1); // 108, l
    printf("t = %d\n", t);                    // 1
    
    // In ký tự từ số
    printf("65 = %c, 97 = %c\n", 65, 97);    // A, a
    
    return 0;
}

Kết quả

s = 109 (char: m)
s+1 = 110 (char: n)
s-1 = 108 (char: l)
t = 1
65 = A, 97 = a

Ứng dụng thực tế

1. Chuyển đổi chữ hoa/thường (ASCII)

char lower = 'A' + 32; // 'a' (65+32=97)
char upper = 'z' - 32; // 'Z' (122-32=90)

// An toàn hơn: dùng ctype.h
#include 
char c = 'A';
char lower = tolower(c); // 'a'
char upper = toupper(c); // 'A'

2. Chuyển chữ số ký tự sang giá trị số

char digit = '7';
int value = digit - '0'; // 7

// Parse số từ chuỗi
int parseInt(const char* str) {
    int result = 0;
    while (*str >= '0' && *str <= '9') {
        result = result * 10 + (*str - '0');
        str++;
    }
    return result;
}

3. Caesar Cipher (Dịch chuyển ký tự)

char caesar(char c, int shift) {
    if (c >= 'a' && c <= 'z') {
        return 'a' + (c - 'a' + shift) % 26;
    }
    if (c >= 'A' && c <= 'Z') {
        return 'A' + (c - 'A' + shift) % 26;
    }
    return c;
}
// caesar('a', 3) = 'd', caesar('z', 1) = 'a'

4. Kiểm tra ký tự

bool isDigit(char c) { return c >= '0' && c <= '9'; }
bool isUpper(char c) { return c >= 'A' && c <= 'Z'; }
bool isLower(char c) { return c >= 'a' && c <= 'z'; }
bool isAlpha(char c) { return isUpper(c) || isLower(c); }
// Hoặc dùng ctype.h: isdigit, isalpha, isupper, islower

Lưu ý quan trọng

  • char có thể signed (-128..127) hoặc unsigned (0..255) tùy implementation
  • Khi làm toán học, char được promote thành int
  • Kết quả gán lại vào char có thể bị truncate/overflow
  • Chỉ an toàn với ASCII. Unicode/UTF-8: một ký tự ≠ một char
  • Dùng <ctype.h> functions cho portable code

Bảng ASCII tham chiếu

'0'..'9' : 48..57
'A'..'Z' : 65..90
'a'..'z' : 97..122
' ' (space) : 32
'\n' (newline) : 10
'\t' (tab) : 9