12.1.1 Khái niệm Như ta đã biết, dữ liệu kiểu char chỉ chứa được một ký tự, để cĩ thể lưu trữ một chuỗi (nhiều ký tự) ta sử dụng mảng ký tự (Chương 11 – Dữ liệu kiểu mảng). 12.1.2 Khai báo
Kiểu dữ liệu chuỗi được khai báo theo cú pháp khai báo mảng một chiều với mỗi phần tử cĩ kiểu char (ký tự).
Ví dụ:
char s[10];
Biến s được khai báo như trên cĩ thể chứa được một chuỗi cĩ độ dài tối đa là 9 ký tự (khơng phải là 10) do trong C chuỗi được được xem là một loạt các ký tự kết thúc bởi ký tự rỗng (NULL), ký hiệu là \0.
Giống như cách khởi tạo mảng thơng thường, để khởi tạo cho chuỗi s giá trị “THCS A” ta thực hiện như sau:
char s[10] = {‘T’, ‘H’, ‘C’, ‘S’, ‘ ’, ‘A’, ‘\0’};
Tuy nhiên, ta cĩ thể khởi tạo cho chuỗi ngắn gọn hơn bằng cách sử dụng chuỗi thường (chuỗi được bao bởi cặp dấu “ ”). Lúc này trình biên dịch tựđộng thêm vào ký tự kết thúc chuỗi (‘\0’).
char s[10] = “THCS A”;
char s[] = “THCS A”; // Tu xac dinh do dai
12.1.3 Nhập xuất chuỗi
Để xuất chuỗi, ta cĩ thể sử dụng hàm printf với đặc tả “%s” hoặc hàm puts như sau:
Hàm xuất dữ liệu ra màn hình (#include <stdio.h>)
int puts(const char *s);
Hàm puts xuất chuỗi s ra màn hình và tựđộng xuống dịng. Nếu thành cơng sẽ trả về giá trị khơng âm, ngược lại sẽ trả về EOF.
Ví dụ:
char ten[] = “THCS A”;
printf(“%s”, ten); // Khong xuong dong
puts(ten); // Tu dong xuong dong
Để nhập chuỗi, ta cĩ thể sử dụng hàm scanf( ) với đặc tả “%s” nhưng hàm này chỉđọc các ký tự từ bàn phím đến khi gặp ký tự khoảng trắng. Ví dụ: char ten[100; scanf(“%s”, &ten); puts(ten);
Để nhập được một chuỗi đầy đủ, ta sử dụng hàm sau:
Hàm nhập dữ liệu từ bàn phím (#include <stdio.h>)
char *gets(char *s);
Hàm gets đọc tất cả các ký tự nhập từ bàn phím đến khi gặp ký tự sang dịng mới (khi ta nhấn enter). Hàm gets sẽ loại bỏ ký tự enter và thêm vào chuỗi ký tự kết thúc chuỗi ‘\0’. Hàm gets trả vềđịa chỉ của chuỗi nhận được.
Ví dụ:
char ten[100]; gets(ten); puts(ten);
12.1.4 Các thao tác trên dữ liệu kiểu chuỗi
Chuỗi chính là mảng ký tự, do đĩ khơng thể gán dữ liệu giữa hai kiểu chuỗi. Thay vào đĩ ta sử dụng lệnh strcpy được định nghĩa trong string.h.
Hàm sao chép chuỗi (#include <string.h>)
char *strcpy(char *dest, const char *src);
Sao chép chuỗi src sang chuỗi dest, kết thúc khi gặp ký tự kết thúc chuỗi. Hàm trả vềđịa chỉ chuỗi dest.
char s[100];
s = “Tin hoc co so A”; // Sai
strcpy(s, “Tin hoc co so A”); // Dung
Trong string.h cịn cung cấp một số hàm khác thao tác trên dữ liệu kiểu chuỗi ký tự. Một vài hàm quan trọng như sau:
Hàm chuyển chuỗi thành chuỗi thường (#include <string.h>)
char *strlwr(char *s);
Hàm strlwr chuyển chuỗi s thành chuỗi thường (các ký tự ‘A’, ‘B’, …, ‘Z’ thành ‘a’, ‘b’, … ‘z’) và trả vềđịa chỉ của chuỗi s.
Hàm chuyển chuỗi thành hoa (#include <string.h>)
char *strupr(char *s);
Hàm strupr chuyển chuỗi s thành chuỗi hoa (các ký tự ‘a’, ‘b’, …, ‘z’ thành ‘A’, ‘B’, … ‘Z’) và trả vềđịa chỉ của chuỗi s.
Hàm đảo ngược chuỗi (#include <string.h>)
char *strrev(char *s);
Hàm đảo ngược thứ tự các ký tự trong chuỗi (trừ ký tự kết thúc chuỗi) và trả vềđịa chỉ của chuỗi kết quả.
Hàm so sánh hai chuỗi (#include <string.h>)
int *strcmp(const char *s1, const char *s2);
Hàm trả về < 0 nếu s1 < s2; = 0 nếu s1 = s2, > 0 nếu s1 > s2.
Hàm nối hai chuỗi (#include <string.h>)
char *strcat(char *dest, const char *src);
Hàm nối chuỗi src và chuỗi dest và trả về địa chỉ của chuỗi đã được nối.
Hàm tính độ dài chuỗi (#include <string.h>)
size_t *strlen(const char *s);
Hàm trả vềđộ dài chuỗi.
Hàm tìm chuỗi này trong chuỗi kia (#include <string.h>)
char *strstr(const char *s1, const char *s2);
Hàm tìm vị trí xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1. Hàm trả về địa chỉ của thành phần đầu tiên trong chuỗi s1 tìm được. Nếu khơng tìm được thì trả về null.