Trong tất cả các chương trình chúng ta đã thấy cho đến giờ, chúng ta chỉ sử dụng các biến kiểu số, chỉ dùng để biểu diễn các số. Nhưng bên cạnh các biến kiểu số còn có các xâu kí tự, chúng cho phép chúng ta biểu diễn các chuỗi kí tự như là các từ, câu, đoạn văn bản... Cho đến giờ chúng ta mới chỉ dùng chúng dưới dạng hằng chứ chứa quan tâm đến các biến có thể chứa chúng.
Trong C không có kiểu dữ liệu cơ bản để lưu các xâu kí tự. Để có thể thỏa mãn nhu cầu này, người ta sử dụng mảng có kiểu char. Hãy nhớ rằng kiểu dữ liệu này (char) chỉ có thể lưu trữ một kí tự đơn, bởi vậy nó được dùng để tạo ra xâu của các kí tự đơn.
có thể lưu một xâu kí tự với độ dài cực đại là 20 kí tự. Bạn có thể tưởng tượng nó như sau:
Kích thước cực đại này không cần phải luôn luôn dùng đến. ví dụ xâu
".. Vì các mảng kí tự có thể lưu các xâu kí tự ngắn hơn độ dài của nó.
T
|
R
|
A
|
N
|
|
K
|
H
|
A
|
N
|
H
|
|
T
|
O
|
A
|
N
|
|
|
|
|
|
1.Khởi tạo các xâu kí tự.
Vì những xâu kí tự là những mảng bình thường nên chúng cũng như các mảng khác. Ví dụ, nếu chúng ta muốn khởi tạo một xâu kí tự với những giá trị xác định chúng ta có thể làm điều đó tương tự như với các mảng khác:
char ho_ten[]={'t','o','a','n'};
char ho_ten[]={"toan"};
char ho_ten[]="xau ki tu";
2.các lệnh nhập xuất dữ liệu dùng riêng cho chuỗi, xâu ký tự
- nhập ký tự vào cho mảng xâu: gets_s(biến kiểu xâu hay tên mảng xâu mà ta đã tạo);
- xuất ký tự trong mảng xâu ra màn hình: puts(biến kiểu xâu hay tên mảng xâu mà ta đã tạo);
*chú ý: trước khi nhập dữ liệu cho mảng xâu ta nên xóa rác trong bộ nhớ đệm cho đảm bảo an toàn khi viết chương trình, cú pháp như sau: _flushall();
3.ví dụ về khởi tạo, nhập và xuất mảng kiểu xâu ký tự:
#include<stdio.h>
#include<conio.h>
void main()
{
char ho_ten[20];
printf("nhap ho va ten:\n");
_flushall();
gets_s(ho_ten);
puts(ho_ten);
_getch();
}
__________________________________________________
#include<stdio.h>
#include<conio.h>
void main()
{
char ho_ten[] = { "ho va ten" };
puts(ho_ten);
_getch();
}
4.Gán giá trị cho xâu kí tự
Vì vế trái của một lệnh gán chỉ có thể là một phần tử của mảng chứ không thể là cả mảng, chúng ta có thể gán một xâu kí tự cho một mảng kiểu char sử dụng một phương pháp như sau:
xau[0]="h";
xau[1]="e";
xau[2]="l";
xau[3]="l";
xau[4]="o";
Nhưng rõ ràng đây không phải là một phương pháp thực tế. Để gán giá trị cho một xâu kí tự, chúng ta có thể sử dụng loạt hàm kiểu strcpy (string copy), hàm này được định nghĩa trong string.h và có thể được gọi như sau:
strcpy (string1, string2);
Lệnh này copy nội dung của string2 sang string1. string2 có thể là một mảng, con trỏ hay một hằng xâu kí tự, bởi vậy lệnh sau đây là một cách đúng để gán xâu hằng "Hello" cho mystring:
strcpy (mystring, "Hello");
ví dụ:
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char ho_ten[20];
strcpy_s(ho_ten, "tran minh an");
puts(ho_ten);
_getch();
}
Để ý rằng chúng ta phải include file <string.h> để có thể sử dụng hàm strcpy., trong visual 2013 thì lệnh strcpy thay thế bằng strcpy_s(...,...);
chúng ta luôn có thể viết một hàm đơn giản như ganchuoi để thay cho lệnh strcpy:
#include<stdio.h>
#include<conio.h>
void copy(char st1[], char st2[])
{
int n = 0;
do
{
st1[n] = st2[n];
n++;
} while (st2[n] != 0);
}
void main()
{
char ho_ten[20];
copy(ho_ten, "tran minh dang");
puts(ho_ten);
_getch();
}
5.Các hàm để thao tác trên chuỗi
Thư viện cstring (string.h) không chỉ có hàm strcpy mà còn có nhiều hàm khác để thao tác trên chuỗi. Dưới đây là giới thiệu lướt qua của các hàm thông dụng nhất:
char* strcat (char* dest, const char* src);
Gắn thêm chuỗi src vào phía cuối của dest. Trả về dest.
int strcmp (const char* string1, const char* string2);
So sánh hai xâu string1 và string2. Trả về 0 nếu hai xâu là bằng nhau.
char* strcpy (char* dest, const char* src);
Copy nội dung của src cho dest. Trả về dest.
size_t strlen (const char* string);
Trả về độ dài của string.
Chú ý: char* hoàn toàn tương đương với char[]