Tải bản đầy đủ (.docx) (13 trang)

Tìm hiểu về các hàm cơ bản chuỗi ký tự và giải quyết một số bài toán cơ bản chuỗi kí tự

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (118.34 KB, 13 trang )

MỤC LỤC

MỤC LỤC.................................................................................................................. i
LỜI NÓI ĐẦU..........................................................................................................ii
CÁC HÀM CƠ BẢN CỦA CHUỖI KÝ TỰ.............................................................1
1.1 Hàm strlen() - Hàm trả về độ dài của một chuỗi kí tự..........................................1
1.2 Hàm strcpy() - Hàm sao chép chuỗi nguồn đến chuỗi đích.................................1
1.3 Hàm strncpy() - Hàm sao chép n ký tự đầu tiên...................................................2
1.4 Hàm strcat() - Hàm nối 2 chuỗi...........................................................................2
1.5 Hàm strcmp() - Hàm so sánh 2 chuỗi..................................................................3
1.6 Hàm strstr() - Hàm tìm kiếm chuỗi......................................................................4
1.7 Hàm strchr() - Hàm tìm kiếm ký tự.....................................................................5
MỘT SỐ BÀI TỐN CƠ BẢN CHUỖI KÍ TỰ.......................................................6
2.1 Tìm kiếm một chuỗi con trong chuỗi chính.........................................................6
2.2 Đếm số từ có trong chuỗi đó................................................................................6
2.3 Chuẩn hóa chuỗi..................................................................................................7
2.4 Đảo ngược từ trong chuỗi....................................................................................8
KẾT LUẬN.............................................................................................................11

i


LỜI NĨI ĐẦU
Chuỗi kí tự là 1 trong những kiểu dữ liệu được sử dụng rất phổ biến. Trong
hầu hết các ứng dụng đều có nhiều thơng tin được biểu diễn dưới dạng văn bản,
tức là chuỗi kí tự. VD: nội dung SMS, email, thông tin sinh viên (họ tên, quê
quán…),….. Chuỗi chính là tập hợp gồm nhiều kí tự (char) lại với nhau. Một
dãy bất kỳ các kí tự (kể cả dấu cách) do vậy nó có thể được lưu bằng mảng kí tự
- hay cịn gọi là mảng 1 chiều các kí tự. Tuy nhiên để chương trình có thể nhận
biết được mảng kí tự này là 1 chuỗi thì theo ngun tắc phải có kí tự NULL ('\0'
– có mã ASCII là 0) làm kí hiệu kết thúc chuỗi. Để thao tác dễ dàng hơn với


chuỗi ký tự, ngơn ngữ lập trình C cung cấp cho người dùng thư viện string.h với
các hàm cơ bản có thể kể đến như strlen() - trả về độ dài của chuỗi; strcpy() - sao
chép chuỗi nguồn sang chuỗi đích; strcat() - nối chuỗi nguồn vào cuối chuỗi
đích; strcmp() - so sánh hai chuỗi;…. Sau đây chúng ta sẽ tìm hiểu lần lượt các
hàm cơ bản này và ứng dụng của chúng trong việc giải quyết các bài toán cơ bản
hay gặp như: đếm số ký tự trong chuỗi, tìm một chuỗi con trong một chuỗi, đảo
ngược chuỗi, tách chuỗi, chuẩn hóa chuỗi, ….
.

ii


CÁC HÀM CƠ BẢN CỦA CHUỖI KÝ TỰ
1.1 Hàm strlen() - Hàm trả về độ dài của một chuỗi kí tự
Hàm strlen() trong C được sử dụng để trả về độ dài của một chuỗi kí tự. Độ
dài chuỗi chính là số lượng kí tự hiện có trong chuỗi đó. Hàm này sẽ đếm số
lượng ký tự trong chuỗi cho đến khi gặp ký tự kết thúc chuỗi '\0'.
Ví dụ: Chuỗi ‘Thong tin’ có độ dài chuỗi là 9 bởi vì nó có 9 kí tự.
Khai báo: strlen(<tên chuỗi ký tự>);
Ví dụ: Để tính và in ra màn hình độ dài chuỗi a= “Thong tin”, ta thực hiện
như sau:
#include <stdio.h>
#include <string.h>
int main()
{
char a[]= "Thong tin";
printf("Do dai cua chuoi a la: %d", strlen(a));
}
Khi đó kết quả được hiển thị ra màn hình là:
Do dai cua chuoi a la: 9


1.2 Hàm strcpy() - Hàm sao chép chuỗi nguồn đến chuỗi đích
Hàm Strcpy() trong lập trình C là một hàm chuỗi được sử dụng để sao chép
chuỗi nguồn đến chuỗi đích. Hàm này có dạng:
char *strcpy(<chuỗi đích>, n>);
Hàm này sẽ sao chép tồn bộ chuỗi nguồn vào chuỗi đích, bao gồm cả kí tự
kết thúc chuỗi `\0`. Hàm sẽ trả về con trỏ tới chuỗi đích.
Ưu điểm của hàm strcpy() là nó giúp cho việc sao chép chuỗi trở nên dễ dàng
và tiết kiệm thời gian. Tuy nhiên, việc sử dụng hàm này cần phải cẩn thận để
tránh gây lỗi khi vượt quá kích thước của chuỗi đích và dữ liệu trước khi sao
chép cịn ở chuỗi đích sẽ bị thay thế bằng dữ liệu ở chuỗi nguồn.
Ví dụ: Sao chép chuỗi b= “Thong tin” sang chuỗi a= “Truong Si quan” sau
đó in chuỗi a ra màn hình:
#include <stdio.h>
#include <string.h>
int main()
{
char a[]= "Truong Si quan ", b[]= "Thong tin";
printf("Chuoi duoc ghep la: ");
strcpy(a, b);
puts(a);
}
Kết quả được in ra màn hình là:
Thong tin
1


1.3 Hàm strncpy() - Hàm sao chép n ký tự đầu tiên
Hàm strncpy() trong thư viện string.h được sử dụng để sao chép n ký tự đầu

tiên của một chuỗi vào một chuỗi khác. Cú pháp của hàm này như sau:
char *strncpy(<chuỗi đích>, n, cầ0
n sao chép>);
Hàm này sẽ sao chép n ký tự đầu tiên của chuỗi nguồn vào chuỗi đích nếu n
nhỏ hơn hoặc bằng độ dài của chuỗi nguồn. Nếu độ dài của chuỗi nguồn nhỏ hơn
n, thì các ký tự cịn lại của chuỗi đích sẽ được điền bằng ký tự NULL. Nếu độ dài
của chuỗi nguồn lớn hơn n, chuỗi đích sẽ chứa n kí tự đầu tiên của chuỗi nguồn.
Ví dụ: Sao chép 14 kí tự đầu tiên của chuỗi a= “Truong Si quan Thong tin”
sang chuỗi b sau đo in chuỗi b ra màn hình, ta thực hiện như sau:
#include <stdio.h>
#include <string.h>
int main()
{
char a[]= "Truong Si quan Thong tin";
char b[30];
strncpy(b,a,14);
puts(b);
}
Khi đó kết quả được hiển thị trên màn hình là:
Truong Si quan

1.4 Hàm strcat() - Hàm nối 2 chuỗi
Hàm strcat() trong C được sử dụng để nối hai chuỗi lại với nhau. Hàm này có
nguyên mẫu như sau:
char* strcat( < chuỗi đích>, < chuỗi nguỗ0
n>);
Hàm này trả về con trỏ tới chuỗi đích.
Các bước thực hiện của hàm strcat() như sau:

1. Tìm vị trí kết thúc của chuỗi đích bằng hàm strlen().
2. Sao chép nội dung của chuỗi nguồn vào sau chuỗi đích bằng hàm strcpy().
3. Trả về con trỏ tới chuỗi đích.
Lưu ý rằng, hàm strcat() khơng kiểm tra tính hợp lệ của địa chỉ và khơng
kiểm tra sự chồng chéo của các chuỗi.
Ví dụ: Nối chuỗi b= “Thong tin” vào sau chuỗi a= “Truong Si quan ” rồi in
ra màn hình chuỗi kết quả, ta thực hiện như sau
#include <stdio.h>
#include <string.h>
int main()
{
char a[]= "Truong Si quan ", b[]= "Thong tin";
printf("Chuoi duoc ghep la: ");
puts(strcat(a, b));
}
2


Khi đó kết quả được hiển thi trên màn hình là:
Truong Si quan Thong tin

1.5 Hàm strcmp() - Hàm so sánh 2 chuỗi
Hàm strcmp() giúp chúng ta tìm hiệu mã ký tự ASSCII giữa 2 chuỗi trong C.
Thông qua hiệu này, chúng ta có thể so sánh 2 chuỗi trong C và tìm ra quan hệ
bằng hay là lớn nhỏ giữa chúng.
Chúng ta sử dụng hàm strcmp() để so sánh 2 chuỗi trong C với cú pháp sau
đây:
int *strcmp(<chuỗi 1>, <chuỗi 2>);
Hàm strcmp() sẽ tiến hành so sánh bắt đầu từ ký tự đầu tiên trong hai chuỗi,
và nếu chúng giống nhau, các ký tự tiếp theo sẽ lần lượt được so sánh cho tới khi

xuất hiện cặp ký tự khác nhau đầu tiên trong hai chuỗi. Khi đó, mã ký tự
ASSCII của ký tự này sẽ đại diện cho cả chuỗi và được dùng để so sánh lớn nhỏ.
Sau khi đã xác định được cặp ký tự đầu tiên khác nhau giữa 2 chuỗi, hàm
strcmp() sẽ trả về hiệu mã ký tự ASSCII giữa chúng, và bằng cách so sánh giá trị
này với số 0, chúng ta có thể so sánh 2 chuỗi như sau:
Biểu thức
Giá trị trả về
Kết quả
strcmp(str1, str2)

>0

str1 > str2

strcmp(str1, str2)

=0

str1 = str2

strcmp(str1, str2)

<0

str1 < str2

Ví dụ: Ta sử dụng chương trình sau đây để tiến hành so sánh lớn nhỏ giữa 2
chuỗi a= “ab” và b= “aAb”.
#include<stdio.h>
#include<stdlib.h>

#include<string.h>
int main()
{
char s1[]= "ab";
char s2[] = "aAb";
printf("Ma ascii cua a:%d\n", 'a');
printf("Ma ascii cua A:%d\n", 'A');
printf("Ma ascii cua b:%d\n", 'b');
printf("Hieu ma ascii: %d\
n",strcmp(s1,s2));
if(strcmp(s1,s2)==0){
printf("%s bang %s", s1,s2);
} else if(strcmp(s1,s2)>0){
printf("%s lon hon %s", s1,s2);
} else
printf("%s nho hon %s", s1,s2);
3


}

return 0;

Kết quả chương trình:
Ma ascii cua
a:97
Ma ascii cua
A:65
Ma ascii cua
b:98

Hieu ma ascii:
33
ab lon hon aAb
Ở ví dụ trên, cặp ký tự đầu tiên khác nhau giữa hai chuỗi ban đầu là b và A,
do đó hàm strcmp() khi so sánh 2 chuỗi s1 và s2 thì thực chất chính là so sánh
giữa 2 ký tự này.

1.6 Hàm strstr() - Hàm tìm kiếm chuỗi.
Hàm strstr() trong C giúp chúng ta tìm kiếm chuỗi con trong chuỗi C. Kết
quả trả về sẽ là địa chỉ của vị trí đầu tiên tìm thấy chuỗi con trong chuỗi ban đầu
dưới dạng con trỏ chuỗi trong c.
Chúng ta sử dụng hàm strstr() để tìm kiếm ký tự trong chuỗi C với cú pháp
sau đây:
char *strstr(u>, n tìm>);
Hàm strstr() sẽ trả về địa chỉ của vị trí đầu tiên tìm thấy của chuỗi ký
tự keyword trong chuỗi str tính từ đầu chuỗi, và trả về vị trí này dưới dạng con
trỏ chuỗi trong c.
Ví dụ:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[30] = “Good school”;
char *p;
p = strstr(str, "o");
printf("%s\n", p);
}
Kết quả chương trình:

ood school
Bạn có thể thấy mặc dù có 2 chuỗi ký tự oo trong chuỗi "Good
School" nhưng chỉ có vị trí xuất hiện đầu tiên của chuỗi con này được trả về
dưới dạng con trỏ chuỗi trong c, khi chúng ta sử dụng hàm strstr() để tìm kiếm
ký tự trong chuỗi C mà thôi.
4


1.7 Hàm strchr() - Hàm tìm kiếm ký tự.
Hàm strchr() giúp chúng ta tìm kiếm ký tự chỉ định trong chuỗi C. Kết quả
trả về sẽ là vị trí đầu tiên tìm thấy ký tự này trong chuỗi ban đầu dưới dạng con
trỏ chuỗi trong C.
Cách sử dụng hàm strchr() cũng tương tự như hàm strstr(), tuy nhiên đối
tượng tìm kiếm trong chuỗi ban đầu của hai hàm này là khác nhau. Hàm strchr()
sẽ tiến hành tìm kiếm ký tự chỉ định, cịn hàm strstr() sẽ tiến hành tìm kiếm
chuỗi con, từ chuỗi ban đầu.
Chúng ta sử dụng hàm strchr() để tìm kiếm ký tự trong chuỗi C với cú pháp
sau đây:
char *strchr(u>,n tìm>);
Hàm strchr() sẽ trả về vị trí đầu tiên tìm thấy của ký tự chr trong
chuỗi str tính từ đầu chuỗi, và trả về vị trí này dưới dạng con trỏ chuỗi trong c.
Ví dụ:
#include <stdio.h>
#include <string.h>
int main()
{
char str[30] = "Good school";
char *p;

p = strchr(str, 'o');
printf("%s\n", p);
}
Kết quả chương trình:
ood school
Bạn có thể thấy mặc dù có nhiều ký tự o trong chuỗi "Good School" nhưng
chỉ có vị trí xuất hiện đầu tiên của ký tự này được trả về dưới dạng con trỏ
chuỗi, khi chúng ta sử dụng hàm strchr() để tìm kiếm ký tự trong chuỗi C mà
thôi.

5


MỘT SỐ BÀI TỐN CƠ BẢN CHUỖI KÍ TỰ
2.1 Tìm kiếm một chuỗi con trong chuỗi chính.
Bài tốn: Viết chương trình nhập vào một chuỗi, sau đó nhập một chuỗi mới
và kiểm tra xem chuỗi mới có xuất hiện trong chuỗi đã có trước đó hay khơng?
Ý tưởng: Sử dụng hàm strstr() để giải quyết bài toán. Lưu kết quả này vào 1
biến. Nếu giá trị của biến là NULL thì tức là khơng có chuỗi con trong chuỗi đó.
Nếu gái trị của biến khác NULL thì in biến đó ra màn hình.
Chương trình:
#include "stdio.h"
#include "string.h"
int main()
{
char chuoi[1000];
char chuoi_con[1000];
printf("Nhap vao chuoi: ");
gets(chuoi);
fflush(stdin);

printf("Nhap vao chuoi can tim: ");
gets(chuoi_con);
fflush(stdin);
char *kq = strstr(chuoi, chuoi_con);
if(kq!=NULL)
{
printf("Tim thay chuoi con!");
}
else
{
printf("Khong tim thay chuoi con!");
}
}

return 0;

2.2 Đếm số từ có trong chuỗi đó
Bài tốn: Đếm trong chuỗi đã cho có bao nhiêu từ?
Ý tưởng:
1. Gán biến dem=0
6


2. Duyệt chuỗi, nếu s[i] là khoản trắng và s[i+1] khác khoản trắng thì tăng
đếm +1
3. Nếu s[0] khác khoản trắng thì dem=1 cịn nếu nó có khoản trắng thì vịng
lặp trên nó sẽ duyệt qua.
Chương trình:
#include<stdio.h>
#include<string.h>

int demsotu(char *s);
int demsotu(char *s)
{
int n=strlen(s),i;
int dem=0;
if(s[0]!=' ')
dem=1;
for( i=0;i{
if(s[i]==' ' && s[i+1]!=' ')
dem++;
}
return dem;
}
int main()
{
char s[1000];
printf("Nhap chuoi: ");
gets(s);
int kq=demsotu(s);
printf("\nSo tu trong chuoi la: %d",kq);
return 0;
}

2.3 Chuẩn hóa chuỗi
Bài tốn: Chuẩn hóa xâu ký tự theo các quy tác sau:
-Xóa bỏ kí tự trống (trắng) đầu dịng
-Xóa bỏ kí tự trống cuối dịng
-Xóa bỏ kí tự trống không hợp lệ(ký tự trống bị thừa)
-In hoa chữ cái đầu tiên

Ý tưởng
1. Bỏ các ký tự khoảng trắng thừa ở đầu chuỗi
2. Bỏ các ký tự khoảng trắng thừa ở cuối chuỗi
3. Viết hoa chữ cái đầu tiên của chuỗi
4. Bỏ qua các khoảng trắng thừa ở giữa
5. Đưa tất cả về lowercase
7


6. Viết hoa chữ cái bắt đầu từ theo ý tưởng đếm từ phía trên
Chương trình
#include <stdio.h>
#include <string.h>
int main()
{
char s[1000];
printf("Nhap chuoi: ");
gets(s);
int dodai= strlen(s) -1;
int dau = 0, cuoi = dodai - 1;
while (dau < cuoi && s[dau] == ' ')
dau++;
while (cuoi > dau && s[cuoi] == ' ')
cuoi--;
if (s[dau] >= 'a' && s[dau] <= 'z')
s[dau] -= 32;
for (int i = dau + 1; i <= cuoi; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z'){
s[i] += 32;

}
if (i + 1 <= cuoi)
{
if (s[i] == s[i + 1] && s[i] == ' ')
{
continue;
}
if (s[i] == ' ' && s[i + 1] >= 'a' && s[i
+ 1] <= 'z')
{
s[i + 1] -= 32;
}
}
}
printf("Chuoi sau chuan hoa la: ");
puts(s);
}

2.4 Đảo ngược từ trong chuỗi
Bài toán: Đảo ngươc thứ tự các từ trong chuỗi
Ý tưởng:
1. Tạo 1 hàm để phân tách các từ trong chuỗi đó.
8


2. Lưu các từ vào một mảng hoặc danh sách.
3. Sử dụng một vòng lặp để lấy mỗi từ trong mảng ghép vào thành 1 chuỗi
4. In chuỗi kết quả ra theo thứ tự ngược lại.
Chương trình:
#include <stdio.h>

#include <string.h>
void Daochuoi(char s[])
{
int i, j, len;
char ch;
j = len = strlen(s)-1;
i = 0;

}

while(i
{
ch =
s[j]
s[i]
i++;
j--;
}

< j)
s[j];
= s[i];
= ch;

int main ()
{
char s1[1000];
char kq[1000] = "";
char tg[1000];
int i, j, n;

gets(s1);
n = strlen(s1);
for(i = n-1; i >= 0; --i)
{
for(j = 0; i >= 0 && s1[i] != ' '; --i,++j)
tg[j] = s1[i];
tg[j] = '\0';
Daochuoi(tg);
9


}

strcat(kq, tg);
strcat(kq, " ");

printf("Chuoi ban dau:\n %s", s1);
printf("\nChuoi sau khi da duoc
%s",kq);
return 0;
}

10

dao

nguoc:\n


KẾT LUẬN

Có thể nói rằng đối với việc học tập các ngơn ngữ lập trình và đặc biệt là
ngơn ngữ lập trình C thì việc thao tác thành thạo với chuỗi ký tự là một kỹ năng
vô cùng quan trọng. Vì vậy, người lập trình cần quan tâm hơn đến việc tìm hiểu,
trau dồi thêm kĩ năng của mình trong việc thao tác xử lý chuỗi. Cần chú trọng
đến việc sử dụng các hàm cơ bản có sẵn trong thư viện string.h của ngơn ngữ lập
trình C. Các hàm này giúp ta tiết kiệm thời gian, làm ngắn chương trình,… Nếu
thành thạo xử lý chuỗi ký tự trong ngôn ngữ C, người lập trình có thể dễ dàng
tiếp cận với các thao tác xử lý chuỗi trong các ngôn ngữ khác.

11



×