














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/