lOMoARcPSD| 58583460
CHUỖI TRONG C++
Quách Đình Hoàng
hoangqd@hcmute.edu.vn
Nội dung
Giới thiệu
Khai báo, khởi tạo và truy xuất
Khai báo chuỗi
Khởi tạo chuỗi
lOMoARcPSD| 58583460
Nhập xuất chuỗi
Các hàm xử lý chuỗi
Các bài toán về chuỗi
Giới thiệu
Chuỗi là dãy các ký tự và có thể rỗng.
- Chuỗi trong C++ được bọc trong cặp dấu “”.
dụ: string s = “C++ String”;
s
Chỉ số
0
1
2
3
4
5
7
8
9
lOMoARcPSD| 58583460
Giá trị
‘C
‘+’
‘+’
‘ ’
‘S
‘t
‘i’
‘n’
g
C++ string là mutable (có thể thay đổi giá trị)
C++ có 2 loại string.
String và Character
String được tạo từ một dãy các ký tự kiu char
Các ký tự trong string có thể được truy xuất
thông qua chỉ số.
Ví dụ:
string s = “C++ String”;
lOMoARcPSD| 58583460
char c1 = s[4]; // `o`
char c2 = s.at(6); // `C`
Chú ý: ký tự được bọc trong cặp dấu ``.
Duyệt qua chuỗi
// Cách 1
for (int i = 0; i < s.length(); i++){ cout << i << "
: '" << s[i] << "'" << endl;
}
cout << endl;
// Cách 2
for (char c : s) {
cout << "'" << c << "'" << endl;
lOMoARcPSD| 58583460
}
cout << endl;
ASCII Characters
Các ký tự có một dạng biểu diễn số
cout << (int) 'A' << endl; // 65
Do đó, ta có thể thực hiện các phép toán trên
ký tự
if (s[i] >= 'A' && s[i] <= 'Z') {
s[i] += 3;
}
lOMoARcPSD| 58583460
Thư viện <cctype>
Thư viện này có các hàm để kiểm tra nh chất của một ký tự.
isalnum: checks if a character is alphanumeric
isalpha: checks if a character is alphabec
islower: checks if a character is lowercase
isupper: checks if a character is an uppercase character
isdigit: checks if a character is a digit
isxdigit: checks if a character is a hexadecimal character
iscntrl: checks if a character is a control character
isgraph: checks if a character is a graphical character
isspace: checks if a character is a space character
isblank: checks if a character is a blank character
isprint: checks if a character is a prinng character
ispunct: checks if a character is a punctuaon character
lOMoARcPSD| 58583460
tolower: converts a character to lowercase
toupper: converts a character to uppercase
•isalnum: kiểm tra xem ký tự có phải là chữ và số không
•isalpha: kiểm tra xem ký tự có phải là chữ cái không
•isher: kiểm tra xem ký tự có phải là chữ thường hay không
•isupper: kiểm tra xem một ký tự có phải là ký tự viết hoa hay không
•isdigit: kiểm tra xem một ký tự có phải là chữ số không
•isxdigit: kiểm tra xem một ký tự có phải là ký tự thập lục phân hay không
•iscntrl: kiểm tra xem một ký tự có phải là ký tự điu khiển không
•isgraph: kiểm tra xem một ký tự có phải là ký tự đồ họa hay không
•isspace: kiểm tra xem một ký tự có phải là ký tự khoảng trắng không
•isblank: kiểm tra xem một ký tự có phải là ký ttrống không
•isprint: kiểm tra xem một ký tự có phải là ký tự in không
•ispunct: kiểm tra xem một ký tự có phải là ký tự dấu chấm câu hay không
•tower: chuyển đổi một ký tự thành chữ thường toupper: chuyển một ký
tự thành chữ hoa
lOMoARcPSD| 58583460
Các phép toán trên string
Phép nối chuỗi: + hoc += string s1
= “Hello”;
string s2 = s1 + “C++”; // s2 = “HelloC++”
Phép so sánh chuỗi: <, <=, >, >=,
==, != if ((s1 > s2) && (s1 != s3)) cout
<< s1 << “ > ” << s2;
lOMoARcPSD| 58583460
Một số hàm hữu ích của string class
s.append(str): add str to the end of s
s.compare(str): return -1, 0, or 1 depending on relave ordering
s.erase(index, length): delete text from a string starng at given index
s.nd(str): rst index where the start of str appears in s (returns
string::npos if not found)
s.rnd(str): last index where the start of str appears in s (returns
string::npos if not found)
s.insert(index, str): add str into s at a given index
s.length() or s.size(): number of characters in s
s.replace(index, len, str): replaces len chars at given index by str
s.substr(start, length) or s.substr(start): return a substring beginning at
start (inclusive); if length omied, grabs ll end of string
1
lOMoARcPSD| 58583460
C++ vs. C strings
C++ có 2 loại chuỗi
C strings (char arrays), kế thừa từ ngôn ngữ C
C++ strings (string objects), là một phần của standard C+
+ library
C string không phải là một class không có các
member funcon như .length(), .append() như C++
string.
Có thể chuyển đổi qua lại giữa C string và C++ string
string s = someCStr; // C string to C++ string
someCPPStr.c_str(); // C++ string to C string
Tham khảo thêm:
hps://cs.stmarys.ca/~porter/csc/ref/c_cpp_strings.
lOMoARcPSD| 58583460
html
Một số vấn đề với C String
Một số lỗi với C string
string s = "hi" + "there"; // C-string + C-string
string s = "hi" + '?'; // C-string + char
string s = "hi" + 41; // C-string + int
Khắc phục với C++ string
string s = string("hi") + "there"; // OK string s
= string("") + "hi" + '?'; // OK
string s = “hi”;
lOMoARcPSD| 58583460
s += 41; // OK but hi)”
Tóm tắt
C++ cả C strings và C++ strings. V bản chất,
chúng đều là mảng ký tự.
C++ strings có nhiều hàm ện ích (s.length() and
s.compare(), …) và dễ sử dụng hơn C string.
C-strings tchuyển thành C++ strings trong nhiều
trường hợp.
Ký tự được bọc trong cặp dấu nháy đơn (‘’) và được
biểu diễn bằng một ASCII cần cẩn thận khi
sử dụng các phép toán số học trên ký tự.
lOMoARcPSD| 58583460
Một số bài toán về chuỗi
Cho chuỗi p và t, hãy
Tìm vị trí xuất hiện cuối cùng của p trong t
Tìm tất cả các vị trí xuất hiện (có/không
chồng lấp) của p trong t
Ví d: Nếu p = “aba” và t = “bbabaxababay” thì p xuất
hiện trong t ở các vị trí 3, 7 và 9. Hai sự xuất hiện của p có
chồng lấp nhau là vị trí 7 và 9.
Một số bài toán về chuỗi
Viết hàm chuanHoa(char s[]) để chuẩn hóa chuỗi s
bỏ toàn bộ khoảng trắng đầu chuỗi, cuối chuỗi
lOMoARcPSD| 58583460
bỏ các khoảng tha giữa 2 ttrong s (chỉ còn 1
khoảng trắng).
Đếm xem có bao nhiêu ttrong s. Xut các từ trên
các dòng liên ếp
Tìm từ có dài nhất nhất trong chuỗi s
Tr về từ thứ k trong chuỗi s
Tham khảo
hp://www.cplusplus.com/reference/string/st
ring/
hps://cs.stmarys.ca/~porter/csc/ref/c_cpp_s
trings.html
lOMoARcPSD| 58583460
hp://www.cplusplus.com/reference/cctype/

Preview text:

lOMoAR cPSD| 58583460 CHUỖI TRONG C++ Quách Đình Hoàng hoangqd@hcmute.edu.vn Nội dung • Giới thiệu
• Khai báo, khởi tạo và truy xuất – Khai báo chuỗi – Khởi tạo chuỗi lOMoAR cPSD| 58583460 • Nhập xuất chuỗi
• Các hàm xử lý chuỗi
• Các bài toán về chuỗi Giới thiệu
Chuỗi là dãy các ký tự và có thể rỗng.
- Chuỗi trong C++ được bọc trong cặp dấu “”.
– Ví dụ: string s = “C++ String”; s Chỉ số 0 1 2 3 4 5 6 7 8 9 lOMoAR cPSD| 58583460 Giá trị ‘ ’ ‘C’ ‘+’ ‘+’
‘S’ ‘t’ ‘r’ ‘i’ ‘n’ ‘g’
• C++ string là mutable (có thể thay đổi giá trị) • C++ có 2 loại string. String và Character
• String được tạo từ một dãy các ký tự kiểu char
• Các ký tự trong string có thể được truy xuất thông qua chỉ số. • Ví dụ:
–string s = “C++ String”; lOMoAR cPSD| 58583460
– char c1 = s[4]; // `o` – char c2 = s.at(6); // `C`
Chú ý: ký tự được bọc trong cặp dấu ``. Duyệt qua chuỗi // Cách 1
for (int i = 0; i < s.length(); i++){ cout << i << "
: '" << s[i] << "'" << endl; } cout << endl; // Cách 2 for (char c : s) {
cout << "'" << c << "'" << endl; lOMoAR cPSD| 58583460 } cout << endl; ASCII Characters
• Các ký tự có một dạng biểu diễn số
cout << (int) 'A' << endl; // 65
• Do đó, ta có thể thực hiện các phép toán trên ký tự
if (s[i] >= 'A' && s[i] <= 'Z') { s[i] += 3; } lOMoAR cPSD| 58583460 Thư viện
Thư viện này có các hàm để kiểm tra tính chất của một ký tự.
• isalnum: checks if a character is alphanumeric
• isalpha: checks if a character is alphabetic
• islower: checks if a character is lowercase
• isupper: checks if a character is an uppercase character
• isdigit: checks if a character is a digit
• isxdigit: checks if a character is a hexadecimal character
• iscntrl: checks if a character is a control character
• isgraph: checks if a character is a graphical character
• isspace: checks if a character is a space character
• isblank: checks if a character is a blank character
• isprint: checks if a character is a printing character
• ispunct: checks if a character is a punctuation character lOMoAR cPSD| 58583460
• tolower: converts a character to lowercase
• toupper: converts a character to uppercase
•isalnum: kiểm tra xem ký tự có phải là chữ và số không
•isalpha: kiểm tra xem ký tự có phải là chữ cái không
•isher: kiểm tra xem ký tự có phải là chữ thường hay không
•isupper: kiểm tra xem một ký tự có phải là ký tự viết hoa hay không
•isdigit: kiểm tra xem một ký tự có phải là chữ số không
•isxdigit: kiểm tra xem một ký tự có phải là ký tự thập lục phân hay không
•iscntrl: kiểm tra xem một ký tự có phải là ký tự điều khiển không
•isgraph: kiểm tra xem một ký tự có phải là ký tự đồ họa hay không
•isspace: kiểm tra xem một ký tự có phải là ký tự khoảng trắng không
•isblank: kiểm tra xem một ký tự có phải là ký tự trống không
•isprint: kiểm tra xem một ký tự có phải là ký tự in không
•ispunct: kiểm tra xem một ký tự có phải là ký tự dấu chấm câu hay không
•tower: chuyển đổi một ký tự thành chữ thường toupper: chuyển một ký tự thành chữ hoa lOMoAR cPSD| 58583460
Các phép toán trên string
• Phép nối chuỗi: + hoặc += string s1 = “Hello”;
string s2 = s1 + “C++”; // s2 = “HelloC++”
• Phép so sánh chuỗi: <, <=, >, >=,
==, != if ((s1 > s2) && (s1 != s3)) cout
<< s1 << “ > ” << s2; lOMoAR cPSD| 58583460
Một số hàm hữu ích của string class
• s.append(str): add str to the end of s
• s.compare(str): return -1, 0, or 1 depending on relative ordering
• s.erase(index, length): delete text from a string starting at given index
• s.find(str): first index where the start of str appears in s (returns string::npos if not found)
• s.rfind(str): last index where the start of str appears in s (returns string::npos if not found)
• s.insert(index, str): add str into s at a given index
• s.length() or s.size(): number of characters in s
• s.replace(index, len, str): replaces len chars at given index by str
• s.substr(start, length) or s.substr(start): return a substring beginning at
start (inclusive); if length omitted, grabs till end of string 1 lOMoAR cPSD| 58583460 C++ vs. C strings • C++ có 2 loại chuỗi
– C strings (char arrays), kế thừa từ ngôn ngữ C
– C++ strings (string objects), là một phần của standard C+ + library
• C string không phải là một class  không có các
member function như .length(), .append() như C++ string.
• Có thể chuyển đổi qua lại giữa C string và C++ string
– string s = someCStr; // C string to C++ string
– someCPPStr.c_str(); // C++ string to C string • Tham khảo thêm:
https://cs.stmarys.ca/~porter/csc/ref/c_cpp_strings. lOMoAR cPSD| 58583460 html
Một số vấn đề với C String
• Một số lỗi với C string
– string s = "hi" + "there"; // C-string + C-string
– string s = "hi" + '?'; // C-string + char
– string s = "hi" + 41; // C-string + int
• Khắc phục với C++ string
– string s = string("hi") + "there"; // OK – string s
= string("") + "hi" + '?'; // OK – string s = “hi”; lOMoAR cPSD| 58583460
– s += 41; // OK but  “hi)” Tóm tắt
• C++ có cả C strings và C++ strings. Về bản chất,
chúng đều là mảng ký tự.
• C++ strings có nhiều hàm tiện ích (s.length() and
s.compare(), …) và dễ sử dụng hơn C string.
• C-strings tự chuyển thành C++ strings trong nhiều trường hợp.
• Ký tự được bọc trong cặp dấu nháy đơn (‘’) và được
biểu diễn bằng một mã ASCII  cần cẩn thận khi
sử dụng các phép toán số học trên ký tự. lOMoAR cPSD| 58583460
Một số bài toán về chuỗi • Cho chuỗi p và t, hãy
– Tìm vị trí xuất hiện cuối cùng của p trong t
– Tìm tất cả các vị trí xuất hiện (có/không
chồng lấp) của p trong t
Ví dụ: Nếu p = “aba” và t = “bbabaxababay” thì p xuất
hiện trong t ở các vị trí 3, 7 và 9. Hai sự xuất hiện của p có
chồng lấp nhau là vị trí 7 và 9.
Một số bài toán về chuỗi
• Viết hàm chuanHoa(char s[]) để chuẩn hóa chuỗi s
– bỏ toàn bộ khoảng trắng đầu chuỗi, cuối chuỗi lOMoAR cPSD| 58583460
– bỏ các khoảng thừa giữa 2 từ trong s (chỉ còn 1 khoảng trắng).
• Đếm xem có bao nhiêu từ trong s. Xuất các từ trên các dòng liên tiếp
• Tìm từ có dài nhất nhất trong chuỗi s
• Trả về từ thứ k trong chuỗi s Tham khảo
• http://www.cplusplus.com/reference/string/st ring/
• https://cs.stmarys.ca/~porter/csc/ref/c_cpp_s trings.html lOMoAR cPSD| 58583460
• http://www.cplusplus.com/reference/cctype/