
Bài 17 Chu iỗ
M c tiêu:ụ
K t thúc bài h c này, b n có th :ế ọ ạ ể
Gi i thích các bi n và 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ả ứ ề ả ư ố
Mô t cách th c s d ng chu i nh các 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 ký t k t thúc b i ký 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 và 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. Ví d khai báo m t bi n chu i:ả ượ ướ ử ụ ụ ộ ế ỗ
char str[10];
str là m t m ng các ký t có th l u t i đa 10 ký t . Gi s str đ c gán m t h ng chu i,ộ ả ự ể ư ố ự ả ử ượ ộ ằ ỗ
“WELL DONE”
M t ộh ng chu iằ ỗ là m t dãy các ký t n m trong d u nháy kép. M i ký t trong m t chu i đ cộ ự ằ ấ ỗ ự ộ ỗ ượ
l u tr nh là 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’
Ký 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. Vì 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 kí hi u k t thúc null.ử ể ứ ệ ế
17.1.1 Con tr tr đ n chu iỏ ỏ ế ỗ
Chu i có th đ c l u và truy c p b ng cách s d ng con tr ki u ký t . M t con tr ki u ký tỗ ể ượ ư ậ ằ ử ụ ỏ ể ự ộ ỏ ể ự
tr đ n m t chu i đ c khai báo nh sau:ỏ ế ộ ỗ ượ ư
char *pstr = “WELCOME”;
Chu iỗ237

pstr là m t con tr đ c kh i t o đ tr đ n m t h ng chu i. Con tr ộ ỏ ượ ở ạ ể ỏ ế ộ ằ ỗ ỏ pstr có th thay đ i đ trể ổ ể ỏ
đ n b t kì m t chu i nào khác. 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.ượ ữ
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 hà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 ký t s đ c nh p vào cho đ n khi nh n phím Enter. Hàm ự ẽ ượ ậ ế ấ gets() thay th ký t k t thúcế ự ế
tr v đ u dòng ‘\n’ b ng ký t ‘\0’. Cú pháp hàm này nh sau:ở ề ầ ằ ự ư
gets(str);
Trong đó str là m t m ng ký 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. Ký 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 là m t m ng ký 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 báo.ộ ể ị ộ
Ví 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 */
puts("Hi there: ");
puts(name); /* Displays the input */
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 có đ nh d ngậ ấ ỗ ị ạ
Có th s đ ng các hàm ể ử ụ scanf() và printf() đ nh p và hi n th các giá tr chu i. Các hàm nàyể ậ ể ị ị ỗ
đ c dùng đ nh p và 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 đó ký hi u đ nh d ng ệ ị ạ %s cho bi t r ng m t giá tr chu i s đ c nh p vào. ế ằ ộ ị ỗ ẽ ượ ậ str là m tộ
m ng ký t đã đ c khai báo. T ng t , đ hi n th chu i, cú pháp s là:ả ự ượ ươ ự ể ể ị ỗ ẽ
printf(“%s”, str);
Trong đó ký hi u đ nh d ng ệ ị ạ %s cho bi t r ng m t giá tr chu i s đ c hi n th và ế ằ ộ ị ỗ ẽ ượ ể ị str là m tộ
m ng ký t đã đ c khai báo và kh i t o. Hàm printf() có th dùng đ hi n th ra các thông báoả ự ượ ở ạ ể ể ể ị
mà không c n kí t đ nh d ng.ầ ự ị ạ
Có 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().
Ví d 2:ụ
#include <stdio.h>
void main()
{
char name[20];
/* name is declared as a single dimensional character
array */
clrscr(); /* Clears the screen */
printf("Enter your name: "); /* Displays a message */
scanf(“%s”, name); /* Accepts the input */
printf("Hi there: %s", name); /* Displays the input */
getch();
}
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
17.2 Các hàm v chu iề ỗ
Chu iỗ239

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 chu iố ỗ
So sánh chu iỗ
Đ nh v m t ký t trong chu iị ị ộ ự ỗ
Sao chép m t chu i sang chu i khácộ ỗ ỗ
Xá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 chu i vào nhau. Cú pháp hàm là:ượ ử ụ ể ố ỗ
strcat(str1, str2);
trong đó str1 và str2 là hai chu i đã đ c khai báo và kh i t o. Hàm này s th c hi n n i chu iỗ ượ ở ạ ẽ ự ệ ố ỗ
str2 vào sau chu i ỗstr1
Ch ng trình sau đây nh n vào h và tên,n i chúng v i nhau và hi n th ra h tên đ y đ .ươ ậ ọ ố ớ ể ị ọ ầ ủ
Ví 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:ế ả ủ ươ ượ ọ ư
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 s (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 kí 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:ư
strcmp(str1, str2);
trong đó str1 và str2 là hai 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:ủ
Ví 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:ế ả ủ ươ ượ ọ ư
Geena compared with Dorothy returned 3
Geena compared with Shania returned -12
Geena compared with Geena returned 0
Chu iỗ241