[Lập trình C] Bài 7 - Chuỗi (String) - BeeLab

Monday, May 15, 2017

[Lập trình C] Bài 7 - Chuỗi (String)

1. Chuỗi là gì?

Dạng chuỗi này bắt nguồn từ ngôn ngữ C và tiếp tục được hỗ trợ trong C/C++. Chuỗi trong ngôn ngữ lập trình C thực chất là mảng một chiều của các ký tự mà kết thúc bởi một ký tự null '\0'.

2. Khai báo chuỗi
Phần khai báo và khởi tạo dưới đây tạo ra một chuỗi bao gồm một từ "Hello". Để giữ các giá trị null tại cuối của mảng, cỡ của mảng các ký tự bao gồm một chuỗi phải nhiều hơn số lượng các ký tự trong từ khóa "Hello".
char loiChao[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
Nếu bạn theo quy tắc khởi tạo các chuỗi, bạn có thể viết lệnh như sau:
char loiChao[] = "Hello";
Dưới đây là phần biểu diễn ô nhớ cho đoạn chuỗi trên trong ngôn ngữ C/C++:
Biểu diễn chuỗi trong C/C++
Thực tế, bạn không đặt ký tự null tại vị trí cuối cùng của biến hằng số. Bộ biên dịch C tự động thêm '\0' tại ví trí cuối cùng của chuỗi khi nó khởi tạo chuỗi. 
  • Nhập chuỗi:
gets(s);
  • Xuất chuỗi:
puts(s);


3. Một số hàm xử lý chuỗi

Các hàm này có trong string.h

a. Cộng chuỗi

  • Hàm strcat()
Cú pháp: char *strcat(char *s1, const char *s2)  
Hàm này có tác dụng Nối xâu ký tự s2 vào sau xâu ký tự s1.
Chú ý: s1 phải đủ lớn để chứa s2

Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình.
b. Xác định độ dài chuỗi
  • Hàm strlen() 
Cú pháp: int strlen(char *s)
Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím.
c. Đổi một ký tự thường thành ký tự hoa
– Hàm toupper(): Hàm toupper() (trong ctype.h) được dùng để chuyển đổi một ký tự thường thành ký tự hoa.
Cú pháp: char toupper(char s)

d. Đổi chuỗi chữ thường thành chuỗi chữ hoa

– Hàm strupr(): Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.
Cú pháp: char *strupr(char *s)
Ví dụ: Viết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm strupr() để chuyển đổi chúng thành chuỗi chữ hoa.

e. Đổi chuỗi chữ hoa thành chuỗi chữ thường
– Hàm strlwr(): Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr().
Cú pháp: char *strlwr(char *s) 

f. Sao chép chuỗi

– Hàm strcpy(): Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn vào chuỗi đích.
Cú pháp: char *strcpy(char *s1, const char *s2) 
Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn vào chuỗi đích.

g. Sao chép một phần chuỗi

– Hàm strncpy(): Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích.
Cú pháp: char *strncpy(char *s1 const char *s2, size_t n) 

h. Trích một phần chuỗi

Hàm strchr(): Để trích một chuỗi con của một chuỗi ký tự bắt đầu từ một ký tự được chỉ định trong chuỗi cho đến hết chuỗi, ta sử dụng hàm strchr().
Cú pháp :  char *strchr(const char *str, int c) 
Lưu ý :
  • Nếu ký tự đã chỉ định không có trong chuỗi, kết quả trả về là NULL ;
  • Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c được tìm thấy đầu tiên trong chuỗi str.

i. Tìm kiếm nội dung chuỗi

– Hàm strstr(): Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1.
Cú pháp: char *strstr(const char *s1, const char *s2) 
Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1.
Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”.

j. So sánh chuỗi

  • Hàm strcmp(): Để so sánh hai chuỗi theo từng ký tự trong bảng mã Ascii, ta có thể sử dụng hàm strcmp().
Cú pháp: int strcmp(const char *s1, const char *s2) 
Hai chuỗi s1 và s2 được so sánh với nhau, kết quả trả về là một số nguyên (số này có được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy ra sự khác nhau).
  • Nếu kết quả là số âm, chuỗi s1 nhỏ hơn chuỗi s2;
  • Nếu kết quả là 0, hai chuỗi bằng nhau;
  • Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.

Khởi tạo chuỗi

– Hàm memset(): Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi là ký tự c.
Cú pháp: memset(char *Des, int c, size_t n) 

Đổi từ chuỗi ra số

hàm atoi(), atof(), atol() (trong stdlib.h): Để chuyển đổi chuỗi ra số, ta sử dụng các hàm trên.
Cú pháp :
int atoi(const char *s) : chuyển chuỗi thành số nguyên
long atol(const char *s) : chuyển chuỗi thành số nguyên dài
float atof(const char *s) : chuyển chuỗi thành số thực
Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0. Ngoài ra, thư viện string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp.