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 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 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 m t dãy các t n m trong d u nháy kép. M i 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 th đ c l u 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”;
Chu i237
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 ượ
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() 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 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 m t m ng t đã đ c khai báo 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
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 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 đó 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 ký t đã đ c khai báo. T ng t , đ hi n th chu i, cú pháp s là: ượ ươ
printf(“%s”, str);
Trong đó 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 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.
th s a đ i ch ng trình bên trên đ nh p vào hi n th m t tên, s d ngm scanf() ươ
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 i239
C h tr r t nhi u hàm v chu i. Các hàm này 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 str2 hai chu i đã đ c khai báo 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 đó str1str2 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 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 i241