Ngôn ngữ lập trình C++ - Chương 5: Con trỏ và xâu ký tự

5.1 Giới thiệu

5.2 Khai báo và khởi tạo biến con trỏ

5.3 Các thao tác trên con trỏ

5.4 Gọi hàm bằng tham chiếu

5.5 Sửdụng const với con trỏ

5.6 Sắp xếp nổi bọt sửdụng Pass-by-Reference

5.7 Các phép toán trên con trỏ

5.8 Quan hệgiữa con trỏvà mảng

5.9 Mảng con trỏ

5.10 Ví dụ:giảlập tráo và chia bài

5.11 Con trỏtới hàm

5.12 Giới thiệu vềxửlý ký tựvà xâu

5.12.1 Tổng quát vềký tựvà xâu

5.12.2 Các hàm xửlý xâu

pdf77 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2329 | Lượt tải: 3download
Tóm tắt nội dung Ngôn ngữ lập trình C++ - Chương 5: Con trỏ và xâu ký tự, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
xâu
s1 thành các “tokens”—từ tố, chẳng hạn 
các từ trong một dòng văn bản—phân tách 
nhau bởi các ký tự chứa trong xâu s2. 
Lời gọi đầu tiên lấy s1 làm tham số thứ 
nhất, các lời gọi tiếp sau (với NULL là tham 
số thứ nhất) tiếp tục lấy các từ tố từ chính 
xâu đó.
Mỗi lời gọi trả về một con trỏ tới từ tố vừa 
nhận được. Nếu không còn từ tố nào, hàm 
sẽ trả về giá trị NULL.
char *strtok( char *s1, const char 
*s2 ); 
So sánh n ký tự xâu s1 và xâu s2. Hàm 
trả về giá trị 0, nhỏ hơn 0 hoặc lớn hơn 0 
nếu s1 bằng, nhỏ hơn hoặc lớn hơn s2.
int strncmp( const char *s1, const 
char *s2, size_t n ); 
© 2004 Trần Minh Châu. FOTECH. VNU
64
Chương 5.
5.12.2 Các hàm xử lý xâu ký tự
• Copy xâu
– char *strcpy( char *s1, const char *s2 )
• Copy tham số thứ hai vào tham số thứ nhất
– Tham số thứ nhất phải có kích thước đủ lớn để chứa xâu 
và ký tự null
– char *strncpy( char *s1, const char *s2, 
size_t n )
• Xác định rõ số ký tự được copy từ xâu vào mảng
• Không nhất thiết copy ký tự null
©2004 Trần Minh Châu.
FOTECH. VNU.
65
fig05_28.cpp
(1 of 2)
1 // Fig. 5.28: fig05_28.cpp
2 // Using strcpy and strncpy.
3 #include 
4 
5 using std::cout;
6 using std::endl;
7 
8 #include // prototypes for strcpy and strncpy
9 
10 int main()
11 {
12 char x[] = "Happy Birthday to You";
13 char y[ 25 ];
14 char z[ 15 ];
15 
16 strcpy( y, x ); // copy contents of x into y
17 
18 cout << "The string in array x is: " << x
19 << "\nThe string in array y is: " << y << '\n';
20 
21 // copy first 14 characters of x into z 
22 strncpy( z, x, 14 ); // does not copy null character
23 z[ 14 ] = '\0'; // append '\0' to z's contents 
24 
25 cout << "The string in array z is: " << z << endl;
 chứa prototype
cho strcpy và strncpy.
Copy toàn bộ xâu trong mảng
x vào mảng y.
Copy 14 ký tự đầu tiên của mảng
x vào mảng y. Chú ý rằng lệnh 
này không viết ký tự null.
Thêm ký tự null.
©2004 Trần Minh Châu.
FOTECH. VNU.
66
fig05_28.cpp
(2 of 2)
fig05_28.cpp
output (1 of 1)
26 
27 return 0; // indicates successful termination
28 
29 } // end main
The string in array x is: Happy Birthday to You
The string in array y is: Happy Birthday to You
The string in array z is: Happy Birthday
Xâu gốc.
Copy xâu bằng strcpy.
Copy 14 ký tự đầu tiên 
bằng strncpy.
© 2004 Trần Minh Châu. FOTECH. VNU
67
Chương 5.
5.12.2 Các hàm xử lý xâu ký tự
• Nối xâu - Concatenating strings
– char *strcat( char *s1, const char *s2 )
• Nối xâu thứ hai vào sau xâu thứ nhất
• Ký tự đầu tiên của tham số thứ hai thay thế ký tự null của tham 
số thứ nhất
• Phải chắc chắn rằng tham số thứ nhất có kích thước đủ lớn để 
chứa thêm phần nối vào và ký tự null kết thúc xâu.
– char *strncat( char *s1, const char *s2, 
size_t n )
• Thêm n ký tự của tham số thứ hai vào sau tham số thứ nhất
• Thêm ký tự null vào kết quả
©2004 Trần Minh Châu.
FOTECH. VNU.
68
fig05_29.cpp
(1 of 2)
1 // Fig. 5.29: fig05_29.cpp
2 // Using strcat and strncat.
3 #include 
4 
5 using std::cout;
6 using std::endl;
7 
8 #include // prototypes for strcat and strncat
9 
10 int main()
11 {
12 char s1[ 20 ] = "Happy ";
13 char s2[] = "New Year ";
14 char s3[ 40 ] = "";
15 
16 cout << "s1 = " << s1 << "\ns2 = " << s2;
17 
18 strcat( s1, s2 ); // concatenate s2 to s1
19 
20 cout << "\n\nAfter strcat(s1, s2):\ns1 = " << s1 
21 << "\ns2 = " << s2;
22 
23 // concatenate first 6 characters of s1 to s3 
24 strncat( s3, s1, 6 ); // places '\0' after last character
25 
 chứa prototype
cho strcat và strncat.
Thêm s2 vào sau s1.
Thêm 6 ký tự đầu tiên của s1 vào sau s3.
©2004 Trần Minh Châu.
FOTECH. VNU.
69
fig05_29.cpp
(2 of 2)
fig05_29.cpp
output (1 of 1)
26 cout << "\n\nAfter strncat(s3, s1, 6):\ns1 = " << s1 
27 << "\ns3 = " << s3;
28 
29 strcat( s3, s1 ); // concatenate s1 to s3
30 cout << "\n\nAfter strcat(s3, s1):\ns1 = " << s1 
31 << "\ns3 = " << s3 << endl;
32 
33 return 0; // indicates successful termination
34 
35 } // end main
s1 = Happy
s2 = New Year
After strcat(s1, s2):
s1 = Happy New Year
s2 = New Year
After strncat(s3, s1, 6):
s1 = Happy New Year
s3 = Happy
After strcat(s3, s1):
s1 = Happy New Year
s3 = Happy Happy New Year
Thêm s1 vào sau s3. 
© 2004 Trần Minh Châu. FOTECH. VNU
70
Chương 5.
5.12.2 Các hàm xử lý xâu ký tự
• So sánh xâu - Comparing strings
– Các ký tự được biểu diễn bằng mã dạng số (numeric code)
• các mã đó được dùng để so sánh các xâu ký tự
– Các bộ mã ký tự (Character codes / character sets)
• ASCII “American Standard Code for Information Interchage”
• EBCDIC “Extended Binary Coded Decimal Interchange Code”
• Các hàm so sánh xâu
– int strcmp( const char *s1, const char *s2 )
• So sánh từng ký tự một, theo thứ tự từ điển
• Trả về 
– 0 nếu xâu bằng nhau
– Giá trị âm nếu xâu thứ nhất nhỏ hơn xâu thứ hai
– Giá trị dương nếu xâu thứ nhất lớn hơn xâu thứ hai
– int strncmp( const char *s1, 
const char *s2, size_t n )
• So sánh n ký tự đầu tiên
• Dừng so sánh nếu gặp ký tự null của 1 trong 2 tham số
©2004 Trần Minh Châu.
FOTECH. VNU.
71
fig05_30.cpp
(1 of 2)
1 // Fig. 5.30: fig05_30.cpp
2 // Using strcmp and strncmp.
3 #include 
4 
5 using std::cout;
6 using std::endl;
7 
8 #include 
9 
10 using std::setw;
11 
12 #include // prototypes for strcmp and strncmp
13 
14 int main()
15 {
16 char *s1 = "Happy New Year";
17 char *s2 = "Happy New Year";
18 char *s3 = "Happy Holidays";
19 
20 cout << "s1 = " << s1 << "\ns2 = " << s2
21 << "\ns3 = " << s3 << "\n\nstrcmp(s1, s2) = "
22 << setw( 2 ) << strcmp( s1, s2 ) 
23 << "\nstrcmp(s1, s3) = " << setw( 2 ) 
24 << strcmp( s1, s3 ) << "\nstrcmp(s3, s1) = "
25 << setw( 2 ) << strcmp( s3, s1 );
 chứa prototype
cho strcmp và strncmp.
So sánh s1 với s2.
So sánh s1 với s3.
So sánh s3 với s1.
©2004 Trần Minh Châu.
FOTECH. VNU.
72
fig05_30.cpp
(2 of 2)
fig05_30.cpp
output (1 of 1)
26 
27 cout << "\n\nstrncmp(s1, s3, 6) = " << setw( 2 ) 
28 << strncmp( s1, s3, 6 ) << "\nstrncmp(s1, s3, 7) = "
29 << setw( 2 ) << strncmp( s1, s3, 7 ) 
30 << "\nstrncmp(s3, s1, 7) = "
31 << setw( 2 ) << strncmp( s3, s1, 7 ) << endl;
32 
33 return 0; // indicates successful termination
34 
35 } // end main
s1 = Happy New Year
s2 = Happy New Year
s3 = Happy Holidays
strcmp(s1, s2) = 0
strcmp(s1, s3) = 1
strcmp(s3, s1) = -1
strncmp(s1, s3, 6) = 0
strncmp(s1, s3, 7) = 1
strncmp(s3, s1, 7) = -1
So sánh 6 ký tự đầu tiên của
s1 với s3.
So sánh 7 ký tự đầu 
tiên của s1 với s3.
So sánh 7 ký tự đầu tiên của 
s3 với s1.
© 2004 Trần Minh Châu. FOTECH. VNU
73
Chương 5.
5.12.2 Các hàm xử lý xâu ký tự
• Phân tích từ tố - Tokenizing
– Chia xâu thành các từ tố, phân tách bởi các ký tự ngăn cách 
(delimiting character)
– Các từ tố thường là các đơn vị logic (logical units), chẳng 
hạn các từ (tách nhau bởi các dấu trống)
– "This is my string" có 4 từ tố (tách nhau bởi các 
dấu trống)
– char *strtok( char *s1, const char *s2 )
• Cần gọi nhiều lần
– Lần gọi đầu cần 2 tham số, xâu cần phân tích từ tố và xâu 
chứa các ký tự ngăn cách
• Tìm ký tự ngăn cách tiếp theo và thay bằng ký tự null 
– Những lời gọi tiếp theo tiếp tục phân tích từ tố trên xâu đó
• Gọi hàm với tham số thứ nhất là NULL
©2004 Trần Minh Châu.
FOTECH. VNU.
74
fig05_31.cpp
(1 of 2)
1 // Fig. 5.31: fig05_31.cpp
2 // Using strtok.
3 #include 
4 
5 using std::cout;
6 using std::endl;
7 
8 #include // prototype for strtok
9 
10 int main()
11 {
12 char sentence[] = "This is a sentence with 7 tokens";
13 char *tokenPtr;
14 
15 cout << "The string to be tokenized is:\n" << sentence
16 << "\n\nThe tokens are:\n\n";
17 
18 // begin tokenization of sentence
19 tokenPtr = strtok( sentence, " " );
20 
 chứa prototype 
cho strtok.
Lời gọi strtok đầu tiên 
khởi đầu việc phân tích từ tố.
©2004 Trần Minh Châu.
FOTECH. VNU.
75
The string to be tokenized is:
This is a sentence with 7 tokens
The tokens are:
This
is
a
sentence
with
7
tokens
After strtok, sentence = This
fig05_31.cpp
(2 of 2)
21 // continue tokenizing sentence until tokenPtr becomes NULL
22 while ( tokenPtr != NULL ) {
23 cout << tokenPtr << '\n';
24 tokenPtr = strtok( NULL, " " ); // get next token 
25 
26 } // end while
27 
28 cout << "\nAfter strtok, sentence = " << sentence << endl;
29 
30 return 0; // indicates successful termination
31 
32 } // end main
Các lời gọi strtok tiếp sau với 
NULL là tham số đầu để tiếp tục việc 
phân tích từ tố trên xâu sentence.
© 2004 Trần Minh Châu. FOTECH. VNU
76
Chương 5.
5.12.2 Các hàm xử lý xâu ký tự
• Xác định độ dài xâu
– size_t strlen( const char *s )
• Trả về số ký tự của xâu
– Không tính đến ký tự null
©2004 Trần Minh Châu.
FOTECH. VNU.
77
fig05_32.cpp
(1 of 1)
1 // Fig. 5.32: fig05_32.cpp
2 // Using strlen.
3 #include 
4 
5 using std::cout;
6 using std::endl;
7 
8 #include // prototype for strlen
9 
10 int main()
11 {
12 char *string1 = "abcdefghijklmnopqrstuvwxyz";
13 char *string2 = "four";
14 char *string3 = "Boston";
15 
16 cout << "The length of \"" << string1
17 << "\" is " << strlen( string1 )
18 << "\nThe length of \"" << string2
19 << "\" is " << strlen( string2 )
20 << "\nThe length of \"" << string3
21 << "\" is " << strlen( string3 ) << endl;
22 
23 return 0; // indicates successful termination
24 
25 } // end main
 chứa prototype 
cho strlen.
Sử dụng strlen để xác định 
độ dài xâu.
The length of "abcdefghijklmnopqrstuvwxyz" is 26
The length of "four" is 4
The length of "Boston" is 6

File đính kèm:

  • pdfNgôn ngữ lập trình C++ - Chương 5 Con trỏ và xâu ký tự.pdf
Tài liệu liên quan