Giáo trình Lập trình cơ bản C - Bài 17: Chuỗi

Bài 17  
Chuỗi  
Mục tiêu:  
Kết thúc bài học này, bạn thể:  
Giải thích các biến hằng kiểu chuỗi  
Giải thích con trỏ trỏ đến chuỗi  
Thực hiện các thao tác nhập/xuất chuỗi  
Giải thích các hàm thao tác chuỗi  
Giải thích cách thức truyền mảng vào hàm như tham số  
tả cách thức sử dụng chuỗi như các đối sốtham số của hàm.  
Giới thiệu  
Các chuỗi trong C được cài đặt như là các mảng tự kết thúc bởi tự NULL (‘\0’). Bài này sẽ thảo  
luận về công dụng và thao tác trên chuỗi.  
17.1 Các biến hằng kiểu chuỗi  
Các biến chuỗi được sử dụng để lưu trữ một chuỗi các ký tự. Như các biến khác, các biến này phải  
được khai báo trước khi sử dụng. dụ khai báo một biến chuỗi:  
Một câu khai báo biến chuỗi điển hình là:  
char str[10];  
str một biến mảng các ký tự thể lưu giữ tối đa 10 ký tự. Giả sstr được gán một hằng chuỗi,  
“WELL DONE”  
Một hằng chuỗi một dãy các ký tự nằm trong dấu nháy kép. Mỗi tự trong một chuỗi được lưu  
trữ như một phần tử của mảng. Trong bộ nhớ, chuỗi được lưu trữ như sau:  
‘W’  
‘E’  
‘L’  
‘L’  
‘ ’  
‘D’  
‘O’  
‘N’  
‘E’  
‘\0’  
tự ‘\0’ (null) được tự động thêm vào trong cách biểu diễn bên trong của chuỗi để đánh dấu điểm  
kết thúc chuỗi. tự ‘\0’ (null) được tự động thêm vào trong cách biểu diễn bên trong của chuỗi để  
chương trình có thể định vị được nơi kết thúc chuỗi. vậy, khi khai báo một chuỗi, phải tăng kích  
thước của nó thêm một phần tử để chứa hiệu kết thúc null.  
vậy, khi khai báo một biến chuỗi, nhớ dành một phần tử trống cho ký hiệu kết thúc null.  
17.1.1 Con trỏ trỏ đến chuỗi  
Chuỗi thể được lưu và truy cập bằng cách sử dụng con trỏ kiểu tự. Một con trỏ kiểu tự trỏ  
đến một chuỗi được khai báo như sau:  
char *pstr = “WELCOME”;  
pstr một con trỏ được khởi tạo để trỏ đến một hằng chuỗi. Con trỏ pstr thể thay đổi để trỏ đến  
bất một chuỗi nào khác. Khi đó, sẽ không thể nào truy xuất đến chuỗi “WELCOME” pstr đang  
Chuỗi  
237  
trỏ đến. Mặc dù khi con trỏ pstr trỏ đến một chuỗi khác thì ta không thể truy xuất đến chuỗi  
“WELCOME”được nữa.  
pstr một con trỏ được khởi tạo để trỏ đến một hằng chuỗi. Con trỏ thể thay đổi để trỏ đến một  
nơi khác. Tuy nhiên, sự thay đổi sẽ làm cho chuỗi trở nên không thể truy cập được nữa.  
17.1.2 Các thao tác nhập xuất chuỗi  
Các thao tác nhập/xuất (I/O) chuỗi trong C được thực hiện bằng cách gọi các hàm. Các hàm này là  
một phần của thư viện nhập/xuất chuẩn tên stdio.h. Một chương trình muốn sử dụng các hàm  
nhập/xuất chuỗi phải có câu lệnh khai báo sau ở đầu chương trình:  
#include <stdio.h>;  
Khi chương trình có chứa câu lệnh này được biên dịch, thì nội dung của tập tin stdio.h sẽ trở thành  
một phần của chương trình.  
Các thao tác nhập/xuất chuỗi đơn giản  
Sử dụng Hhàm gets() là cách đơn giản nhất để nhập một chuỗi thông qua thiết bị nhập chuẩn. Các  
tự sẽ được nhập vào cho đến khi nhấn phím Enter. Hàm gets() thay thế tự kết thúc trở về  
đầu dòng ‘\n’ bằng tự ‘\0’. Cú pháp hàm này như sau:  
gets(str);  
Trong đó str một mảng tự đã được khai báo.  
Tương tự, hàm puts() được sử dụng để hiển thị một chuỗi ra thiết bị xuất chuẩn. tự xuống  
dòng sẽ kết thúc việc xuất chuỗi. Cú pháp hàm như sau:  
puts(str);  
Trong đó str một mảng tự đã được khai báo và khởi tạo. Chương trình sau đây nhận vào một  
tên và hiển thị một thông điệpthông báo.  
dụ 1:  
#include <stdio.h>  
void main()  
{
char name[20];  
/*  
name is declared as a single dimensional character  
array */  
clrscr();  
/* Clears the screen */  
puts("Enter your name:"); /* Displays a message */  
gets(name);  
/* Accepts the input */  
/* Displays the input */  
puts("Hi there: ");  
puts(name);  
getch();  
238  
Lập trình cơ bản C  
}
Nếu tên Lisa được nhập vào, chương trình trên cho ra kết quả:  
Enter your name:  
Lisa  
Hi there:  
Lisa  
Các thao tác Nhập/Xuất chuỗi định dạng  
thể sử đụng các hàm scanf() printf() để nhập hiển thị các giá trị chuỗi. Các hàm này  
được dùng để nhập hiển thị các kiểu dữ liệu hỗn hợp trong một câu lệnh duy nhất. Cú pháp để  
nhập một chuỗi như sau:  
scanf(“%s”, str);  
Trong đó hiệu định dạng %s cho biết rằng một giá trị chuỗi sẽ được nhập vào. str một mảng  
tự đã được khai báo. Tương tự, để hiển thị chuỗi, cú pháp sẽ là:  
printf(“%s”, str);  
tTrong đó hiệu định dạng %s cho biết rằng một giá trị chuỗi sẽ được hiển thị str một  
mảng tự đã được khai báo và khởi tạo. Hàm printf() có thể được sử dụng không kèm theo ký tự  
định dạng để hiển thị các thông báo.Hàm printf() có thể dùng để hiển thị ra các thông báo mà  
không cần tự định dạng.  
thể sửa đổi chương trình bên trên để nhập vào và hiển thị một tên, sử dụng hàm scanf() và  
printf().  
dụ 2:  
#include <stdio.h>  
void main()  
{
char name[20];  
/*  
name is declared as a single dimensional character  
array */  
clrscr();  
printf("Enter your name: ");  
/* Clears the screen */  
/* Displays a message */  
scanf(“%s”, name);  
printf("Hi there: %s", name);  
getch();  
/* Accepts the input */  
/* Displays the input */  
}
Nếu nhập vào tên Brendan , chương trình trên cho ra kết quả:  
Enter your name: Brendan  
Hi there: Brendan  
Chuỗi  
239  
17.2 Các hàm về chuỗi  
C hỗ trợ rất nhiều hàm về chuỗi. Các hàm này có thể tìm thấy trong tập tin string.h. Một số thao tác  
mà các hàm này thực hiện là:  
Nối kết chuỗi  
So sánh chuỗi  
Định vị một tự trong chuỗi  
Sao chép một chuỗi sang chuỗi khác  
TínhXác định chiều dài của chuỗi.  
17.2.1 Hàm strcat()  
Hàm strcat() được sử dụng để nối hai giá trị chuỗi vào một chuỗinhau. Cú pháp hàm là:  
strcat(str1, str2);  
trong đó str1 str2 là hai mảng tựchuỗi đã được khai báo khởi tạo. Giá trị trong str2 được gắn  
vào cuối chuỗi str1.Hàm này sẽ thực hiện nối Cchuỗi str2 được nối vào sau chuỗi str1  
Chương trình sau đây nhận vào họ và tên,. Nó sẽ nối chúng với nhau và hiển thị ra họ tên đầy đủ.  
Chương trình sau đây nhận vào họ và tên. Nó sẽ nối tên vào họ hiển thị tên đã được nối.  
dụ 3:  
#include<stdio.h>  
#include<string.h>  
void main()  
{
char firstname[15];  
char lastname[15];  
clrscr();  
printf("Enter your first name: ");  
scanf("%s", firstname);  
printf("Enter your last name:");  
scanf("%s", lastname);  
strcat(firstname, lastname);  
/* Attaches the contents of lastname at the end of firstname */  
printf("%s", firstname);  
getch();  
}
Kết quả của chương trình trên được minh họa như sau:  
Một mẫu xuất ra màn hình của chương trình trên sẽ là:  
Enter your first name: Carla  
Enter your last name: Johnson  
CarlaJohnson  
240  
Lập trình cơ bản C  
17.2.2 Hàm strcmp()  
Việc so sánh hai chuỗisố (bằng nhau hay không bằng nhau) có thể thực hiện bằng cách sử dụng các  
toán tử quan hệ. Tuy nhiên, để so sánh hai chuỗi tự, phải dùng một hàm. Hàm strcmp() so sánh hai  
chuỗi với nhau và trả về một số nguyên phụ thuộc vào kết quả so sánh. Cú pháp của hàm strcmp()  
như sau:  
Sự bằng nhau (hay không bằng nhau) của hai số thể được chứng thực bằng cách sử dụng các toán  
tử quan hệ. Tuy nhiên, để so sánh các chuỗi, phải dùng một lời gọi hàm. Hàm strcmp() so sánh hai  
chuỗi trả về một giá trị số nguyên dựa trên kết quả của sự so sánh. Cú pháp hàm là:  
strcmp(str1, str2);  
trong đó str1 str2 là hai mảng tựchuỗi đã được khai báo và khởi tạo.Hàm trả về giá trị:  
Nhỏ hơn 0 nếu str1<str2  
0 nếu str1 = str2  
Lớn hơn 0 nếu str1>str2  
Chương trình sau đây so sánh biến name1 với các biến name2, name3, name4 và hiển thị kết quả của  
phép so sánh:  
Chương trình sau đây so sánh một tên với ba tên khác và hiển thị kết quả của phép so sánh.  
dụ 4:  
#include <stdio.h>  
#include<string.h>  
void main()  
{
char name1[15] = "Geena";  
char name2[15] = "Dorothy";  
char name3[15] = "Shania";  
char name4[15] = "Geena";  
int i;  
clrscr();  
i = strcmp(name1,name2);  
printf("%s compared with %s returned %d\n", name1, name2, i);  
i=strcmp(name1, name3);  
printf("%s compared with %s returned %d\n", name1, name3, i);  
i=strcmp(name1,name4);  
printf("%s compared with %s returned %d\n", name1, name4, i);  
getch();  
}
Kết quả của chương trình trên được minh họa như sau:  
Mẫu xuất ra màn hình của chương trình trên sẽ là:  
Geena compared with Dorothy returned 3  
Geena compared with Shania returned -12  
Geena compared with Geena returned 0  
Chuỗi  
241  
Lưu ý giá trị trả vtrong mỗi phép so sánh dụ trên. Đó sự khác nhau về mã ASCII của hai kí tự  
khác nhau đầu tiên tìm thấy trong hai chuỗi.  
Lưu ý giá trị trả vcho mỗi phép so sánh. Nó là sự khác biệt giữa các giá trị ASCII của hai ký tự khác  
nhau đầu tiên tìm gặp trong hai chuỗi.  
17.2.3 Hàm strchr()  
Hàm strchr() xác định vị trí xuất hiện của một tự trong một chuỗi. Cú pháp hàm là:  
strchr(str, chr);  
trong đó str là một mảng tự hay chuỗi. chr là một biến tự chứa giá trị cần tìm. Hàm trả về con trỏ  
trỏ đến giá trị tìm được đầu tiên trong chuỗi, hoặc NULL nếu không tìm gặpthấy.  
Chương trình sau đây xác định liệu tự ‘a’ có xuất hiện trong hai tên thành phố được nêu ratên hai  
thành phố hay không.  
242  
Lập trình cơ bản C  
dụ 5:  
#include <stdio.h>  
#include<string.h>  
void main()  
{
char str1[15] = "New York";  
char str2[15] = "Washington";  
char chr = 'a', *loc;  
clrscr();  
loc = strchr(str1, chr);  
/* Checks for the occurrence of the character value held by chr  
in the first city name */  
if(loc != NULL)  
printf("%c occurs in %s\n", chr, str1);  
else  
printf("%c does not occur in %s\n", chr, str1);  
loc = strchr(str2, chr);  
/* Checks for the occurrence of the character in the second  
city name */  
if(loc != NULL)  
printf("%c occurs in %s\n", chr, str2);  
else  
printf("%c does not occur in %s\n", chr, str2);  
getch();  
}
Kết quả của chương trình trên được minh họa như sau:  
Kết quả xuất ra màn hình của chương trình trên là:  
a does not occur in New York  
a occurs in Washington  
17.2.4 Hàm strcpy()  
Trong C không có toán tử nào xử một chuỗi như một đơn vị duy nhất. vậy, phép gán một giá  
trị chuỗi này cho một chuỗi khác đòi hỏi phải sử dụng hàm strcpy(). Cú pháp hàm là:  
strcpy(str1, str2);  
trong đó str1 str2 là hai mảng tự đã được khai báo và khởi tạo. Hàm sao chép giá trị str2 vào  
str1 trả về chuỗi str1.  
Chương trình sau đây minh họa việc sử dụng hàm strcpy(). Nó thay đổi tên của một khách sạn hiển  
thị tên mới.  
dụ 6:  
Chuỗi  
243  
#include <stdio.h>  
#include<string.h>  
void main()  
{
char hotelname1[15] = "Sea View";  
char hotelname2[15] = "Sea Breeze";  
clrscr();  
printf("The old name is %s\n", hotelname1);  
strcpy(hotelname1, hotelname2);  
/*Changes the hotel name*/  
printf("The new name is %s\n", hotelname1);  
/*Displays the new name*/  
getch();  
}
Kết quả của chương trình trên được minh họa như sau:  
Kết quả xuất ra màn hình của chương trình trên là:  
The old name is Sea View  
The new name is Sea Breeze  
17.2.5 Hàm strlen()  
Hàm strlen() trả về chiều dài của chuỗi. Chiều dài của chuỗi rất hay được sử dụng trong các vòng lặp  
truy câp từng tự của chuỗi. Cú pháp của hàm là:  
Hàm strlen() trả về độ dài chuỗi. Độ dài chuỗi thể hữu dụng trong các chương trình truy cập đến  
từng tự của chuỗi trong một vòng lặp. Cú pháp hàm là:  
strlen(str);  
trong đó str mảng tự đã được khai báo và khởi tạo. Hàm trả về độ dài chuỗichiều dài của chuỗi  
str.  
Chương trình sau đây đưa ra ví dụ đơn giản sử dụng hàm strlen(). Nó tìm chiều dài của tên một công  
ty và hiển thị tên công ty đó với các ký tự được phân cách nhau bởi tự ‘*’.hiển thị tên đó ra màn hình  
cùng với một số các kí tự khác.  
Chương trình sau đây cho thấy thao tác đơn giản của hàm strlen(). Nó xác định độ dài chuỗi của một tên công ty  
hiển thị tên cùng với một số tự thêm vào.  
dụ 7:  
#include<stdio.h>  
#include<string.h>  
void main()  
{
char compname[20] = "Microsoft";  
int len, ctr;  
244  
Lập trình cơ bản C  
clrscr();  
len = strlen(compname);  
/* Determines the length of the string */  
for(ctr = 0; ctr < len; ctr++)  
/* Accesses and displays each character of the string*/  
printf("%c * ", compname[ctr]);  
getch();  
}
Kết quả của chương trình trên được minh họa như sau:  
Kết quả xuất ra màn hình của chương trình trên là:  
M * i * c * r * o * s * o * f * t *  
17.3 Truyền mảng vào hàm  
Trong C, khi một mảng được truyền vào hàm như một đốitham số, thì chỉ địa chỉ của mảng được  
truyền vào. Tên mảng không kèm theo chỉ số địa chỉ của mảng. Đoạn dưới đây tả cách  
truyền địa chỉ của mảng ary cho hàm fn_ary():  
Đoạn trích mã lệnh sau đây truyền địa chỉ của mảng ary vào hàm fn_ary():  
void main()  
{
int ary[10];  
.
.
fn_ary(ary);  
.
.
}
Nếu đốitham số của hàm là một mảng một chiều, thì tham số hình thức đó thể được khai báo theo  
một trong các cách sau:  
Nếu một hàm nhận một mảng một chiều, các tham số hình thức thể được khai báo theo một trong  
các cách sau đây:  
fn_ary (int ary [10])  
/* sized array */  
/*unsized array */  
{
:
}
hoặc  
fn_arry (int ary [])  
{
:
}
Cả hai khai báo trên đều cho cùng kết quả. Kiểu thứ nhất sử dụng cách khai báo mảng chuẩn, chỉ rõ  
ra kích thước của mảng. Kiểu thứ hai, chỉ ra rằng tham số một mảng kiểu int có kích thước bất kì.  
Cả hai khai báo trên đều cho cùng kết quả. Kiểu đầu tiên sử dụng cách khai báo mảng chuẩn. Ở kiểu  
thứ hai, khai báo mảng đơn giản chỉ tả rằng cần đưa vào một mảng kiểu int với một độ dài nào đó.  
Chuỗi  
245  
Chương trình sau đây nhận các số vào một mảng số nguyên. Sau đó mảng này sẽ được truyền vào hàm  
sum_arr(). Hàm sẽ tính toán và trả về tổng của các số nguyên trong mảng.  
dụ 8:  
#include <stdio.h>  
void main()  
{
int num[5], ctr, sum = 0;  
int sum_arr(int num_arr[]); /* Function declaration */  
clrscr();  
for(ctr = 0; ctr < 5; ctr++) /*Accepts numbers into the array*/  
{
printf("\nEnter number %d: ", ctr+1);  
scanf("%d", &num[ctr]);  
}
sum = sum_arr(num); /* Invokes the function */  
printf("\nThe sum of the array is %d", sum);  
getch();  
}
int sum_arr(int num_arr[]) /* Function definition */  
{
int i, total;  
for(i = 0, total = 0; i < 5; i++) /* Calculates the sum */  
total += num_arr[i];  
return total; /* Returns the sum to main() */  
}
Kết quả của chương trình trên được minh họa như sau:  
Một mẫu kết xuất ra màn hình của chương trình trên là:  
Enter number 1: 5  
Enter number 2: 10  
Enter number 3: 13  
Enter number 4: 26  
Enter number 5: 21  
The sum of the array is 75  
17.4 Truyền chuỗi vào hàm  
246  
Lập trình cơ bản C  
Chuỗi, hay mảng tự, thể được truyền vào hàm. Ví dụ, chương trình sau đây sẽ nhận vào các  
chuỗi đưa vào lưu trong một mảng tự hai chiều. Sau đó, mảng này sẽ được truyền vào trong một  
hàm dùng để xác địnhtìm chuỗi dài nhất trong mảng đó.  
dụ 9:  
#include <stdio.h>  
void main()  
{
char lines[5][20];  
int ctr, longctr = 0;  
int longest(char lines_arr[][20]);  
/* Function declaration */  
clrscr();  
for(ctr = 0; ctr < 5; ctr++)  
/* Accepts string values into the array */  
{
printf("\nEnter string %d: ", ctr + 1);  
scanf("%s", lines[ctr]);  
}
longctr = longest(lines);  
/* Passes the array to the function */  
printf("\nThe longest string is %s", lines[longctr]);  
getch();  
}
int longest(char lines_arr[][20]) /* Function definition */  
{
int i = 0, l_ctr = 0, prev_len, new_len;  
prev_len = strlen(lines_arr[i]);  
/* Determines the length of the first element */  
for(i++; i < 5; i++)  
{
new_len = strlen(lines_arr[i]);  
/* Determines the length of the next element */  
if(new_len > prev_len)  
l_ctr = i;  
/* Stores the subscript of the longer string */  
prev_len = new_len;  
}
return l_ctr;  
/* Returns the subscript of the longest string */  
}
Chuỗi  
247  
Kết quả của chương trình trên được minh họa như sau:  
Một mẫu kết xuất ra màn hình của chương trình trên là:  
Enter string 1: The  
Enter string 2: Sigma  
Enter string 3: Protocol  
Enter string 4: Robert  
Enter string 5: Ludlum  
The longest string is Protocol  
248  
Lập trình cơ bản C  
Tóm tắt bài học  
Chuỗi trong C được cài đặt như mảng các ký tự kết thúc bằng tự NULL (‘\0’).  
Các biến chuỗi được sử dụng để lưu trữ một dãy các ký tự.  
Một hằng chuỗi một dãy các ký tự bao bởi dấu nháy kép.  
Các chuỗi thể được lưu trữ và truy cập bằng cách sử dụng các con trỏ tự.  
Các thao thác nhập/xuất chuỗi trong C được thực hiện bằng các hàm thuộc thư viện nhập/xuất  
chuẩn stdio.h.  
Hàm gets() puts() là cách đơn giản nhất để nhập vào và hiển thị chuỗi.  
Hàm scanf() printf() thể được sử dụng để nhập vào và hiển thị chuỗi đi cùng với các kiểu  
dữ liệu khác.  
C hỗ trợ rất nhiều hàm về chuỗi, mà chúng ta có thể tìm thấy trong tập tinthư viện chuẩn header  
string.h.  
Hàm strcat() được sử dụng để nối hai giá trị chuỗi vào một.  
Hàm strcmp() so sánh hai chuỗi trả về một số nguyên dựa vào kết quả của phép so sánh.  
Hàm strchr() xác định vị trí xuất hiện của một tự trong một chuỗi.  
Hàm strcpy() sao chép nội dung của một chuỗi vào một chuỗi khác.  
Hàm strlen() trả về đdài của chuỗi.  
Trong C, khi một mảng được truyền vào hàm như một đốitham số, chỉ địa chỉ của mảng được  
truyền vào.  
Tên mảng không đi kèm với chỉ sđịa chỉ của mảng.  
Chuỗi  
249  
Kiểm tra tiến độ học tập  
1. Các chuỗi được kết thúc bởi tự __________.  
2. Số lượng tự thể nhập vào char_arr[15] là _________.  
3. Sự thay đổi giá trị của con trỏ kiểu chuỗi thể dẫn đến mất dữ liệu.  
4. Ký tự __ được sử dụng để sang dòng mới trong printf().  
(Đúng / Sai)  
5. Để sử dụng hàm strcat(), tập tin header ________ phải được bao gồm trong chương trình.  
6. Hai con trỏ thể so sánh được chỉ khi cả hai biến đang trỏ đến các biến kiểu khác nhau.  
(Đúng / Sai)  
7. strcmp() trả về _______ nếu hai chuỗi hoàn toàn giống nhau.  
8. Khi một mảng được truyền vào một hàm, chỉ có _______ của được truyền.  
250  
Lập trình cơ bản C  
Bài tập tự làm  
1. Viết một chương trình để nhập vào hai chuỗi. Chương trình sẽ xác định liệu chuỗi thứ nhất xuất  
hiện ở cuối chuỗi thứ hai không.  
2. Viết một chương trình nhập vào một mảng các số hiển thị giá trị trung bình. Sử dụng hàm để  
tính giá trị trung bình.  
Chuỗi  
251  
doc 15 trang Thùy Anh 26/04/2022 6680
Bạn đang xem tài liệu "Giáo trình Lập trình cơ bản C - Bài 17: Chuỗi", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_lap_trinh_co_ban_c_bai_17_chuoi.doc