1. Trang chủ
  2. » Luận Văn - Báo Cáo

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ự

13 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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ự
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Khoa học Máy tính
Thể loại Bài giảng
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 13
Dung lượng 39,22 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 nguyên 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, ….

Trang 1

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 TOÁ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

Trang 2

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 nguyên 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, …

Trang 3

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>, <chuỗi nguỗ0n>);

Hàm này sẽ sao chép toà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

Trang 4

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>, <chuỗi nguỗ0n, <sỗ5 kí tự cầ0n 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ỗ0n>);

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));

}

Trang 5

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);

Trang 6

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(<chuỗi ban đầ0u>, <chuỗi cầ0n 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

Trang 7

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(<chuỗi ban đầ0u>,<ký tự cầ0n 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

Trang 8

MỘT SỐ BÀI TOÁ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 toá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 toán: Đếm trong chuỗi đã cho có bao nhiêu từ?

Ý tưởng:

1 Gán biến dem=0

Trang 9

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<n-1;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 toá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

Trang 10

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 đó

Trang 11

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 < j)

{

ch = s[j];

s[j] = s[i];

s[i] = ch;

i++;

j ;

}

}

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);

Trang 12

strcat(kq, tg);

strcat(kq, " ");

}

printf("Chuoi ban dau:\n %s", s1);

printf("\nChuoi sau khi da duoc dao nguoc:\n

%s",kq);

return 0;

}

Trang 13

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

Ngày đăng: 30/06/2023, 14:15

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w