Cùng tìm hiểu về kiểu dữ liệu string trong C++. Bạn sẽ biết khái niệm string là gì trong C++, cách khai báo string trong C++, cách khởi tạo string trong C++, cách gán string trong C++ cũng như cách truy xuất ký tự của string. Bạn cũng sẽ biết sự khác biệt giữa mảng ký tự và string trong C++ sau bài học này.
I. String Trong C++ Là Gì
Trong ngôn ngữ C++, có một kiểu dữ liệu gọi là kiểu char (kiểu ký tự) ( char là viết tắt của character). Đây là kiểu dữ liệu có kích thước bộ nhớ là 1 byte. Vì 1 byte là đơn vị nhỏ nhất nên có thể nói char là loại có kích thước bộ nhớ nhỏ nhất.
Khi chúng ta nối những ký tự (char) trong C++ lại với nhau thì sẽ được 1 chuỗi ký tự. Ví dụ như “Hello” là 1 chuỗi ký tự được tạo bởi các ký tự đơn chẳng hạn.
Và chúng ta gọi loại dữ liệu được tạo thành bởi tập hợp những ký tự đơn như vậy là kiểu dữ liệu string trong C++ hay còn gọi là chuỗi string trong C++.
Để xử lý chuỗi string trong C++, chúng ta có thể dùng đến mảng ký tự được kế thừa từ ngôn ngữ C, hoặc là sử dụng tới std::string là một trình bao bọc để xử lý chuỗi thuận tiện mới được thêm vào C++. Về phương pháp sử dụng string trong c++ bằng mảng ký tự thì Kiyoshi đã phân tích rất kỹ trong loạt bài tại chuyên đề Chuỗi trong C rồi.
II. Nhập String Trong C++
Hướng dẫn cách nhập xuất string trong C++. Bạn sẽ học được cách sử dụng lệnh cin, cout cũng như hàm getline() để nhập xuất string trong C++ sau bài học này.
Nhập xuất string trong C++*
Giống như việc nhập các loại dữ liệu khác, chúng ta sử dụng lệnh cin để nhập vào một string trong C++ với cú pháp sau đây:
string str; cin >> str
Trong đó dòng đầu tiên dùng để khai báo biến str có kiểu string, và dòng thứ 2 dùng để gán dữ liệu nhập từ bàn phím vào biến str.
Tương tự, chúng ta sử dụng lệnh cout để xuất vào một string trong C++ với cú pháp sau đây:
cout >> str
Ví dụ, chúng ta viết chương trình nhập xuất string trong C++ như sau:
#include <iostream> #include <cstring> using namespace std; int main() { cout << “Nhap chuoi ky tu: “; string str; cin >> str; cout <<“Chuoi ky tu vua nhap: “<< str; return 0; }
Khi đó màn hình nhập dữ liệu sẽ như sau:
Nhap chuoi ky tu: abcdd Chuoi ky tu vua nhap: abcdd
Nhập nhiều string trong C++
Để nhập nhiều string trong C++ cách nhau bởi dấu cách, chúng ta viết các string nhập vào cách nhau bởi toán tử >>, khi dùng lệnh cin với cú pháp sau đây:
string str1, str1, str3; cin >> str1 >> str2 >>str3 ;
Ví dụ, chúng ta viết chương trình nhập nhiều string trong C++ như sau:
#include <iostream> #include <cstring> using namespace std; int main(){ cout << “Nhap cac chuoi: “; string str1, str2, str3; cin >> str1 >> str2 >>str3 ; cout <<“Cac chuoi vua nhap: “<<str1<<‘ ‘<<str2<<‘ ‘ <<str3; }
Khi đó màn hình nhập dữ liệu sẽ hiện ra. Chúng ta nhập từng string cách nhau bởi dấu cách từ bàn phím như sau:
Nhap cac chuoi: ab cd123 ef8 Cac chuoi vua nhap: ab cd123 ef8
III. Các Hàm String Trong C++
Thư viện <string> rất nhiều hàm cho phép xử lý chuỗi. Ví dụ: tìm chiều dài chuỗi, so sánh hai chuỗi, tìm kiếm/rút trích chuỗi con, nối chuỗi,…
Hàm s.length()
Trả về số lượng ký tự trong string s.
string s1 = “introduction to programming”; cout<<“length of s1 = “<<s1.length();//27
Hàm s.substr(x, y)
Rút trích một chuỗi con với chiều dài y bắt đầu tại vị trí x. Nếu không có y, một chuỗi con từ vị trí x tới cuối chuỗi sẽ được rút trích.
string s1 = “introduction to programming”; cout<<“substring has 10 characters of s1 start at 5:”<<s1.substr(5, 10); //Kết quả: substring has 10 characters of s1 start at 5:duction to
Hàm s.find(r)
Kiểm tra chuỗi string r có xuất hiện trong chuỗi s hay không. Nếu có thì trả về vị trí bắt đầu xuất hiện chuỗi r trong chuỗi s.
string s1 = “introduction to programming”; cout<<“position of ‘duc’ string in s1:”<<s1.find(“duc”);//5
Hàm s.erase(x, n)
Xóa n ký tự bắt đầu tại vị trí x.
string s1 = “introduction to programming”; s1.erase(5, 15); cout<<“s1 string after erase:”<<s1;//s1 string after erase:introramming
Hàm s.replace(x, n, str)
Thay thế n ký tự tại vị trí bắt đầu là x bằng chuỗi str. Lưu ý: chiều dài của str có thể lớn hơn n.
string s1 = “introduction to programming”; s1.replace(5, 10, “123123123”); cout<<“s1 string after replace:”<<s1;//s1 string after replace:intro123123123 programming
Hàm s1.compare(s2)
So sánh chuỗi s1 với s2. Giá trị trả về là -1 nếu s1 < s2, bằng 0 nếu s1 == s2, là 1 nếu s1 > s2.
string s1 = “introduction to programming”; string s2 = “c++ programming language”; cout<<“s1 compare s2:”<<s1.compare(s2);//1
Hàm s1.swap(s2)
Hoán đổi nội dung hai chuỗi.
string s1 = “introduction to programming”; string s2 = “c++ programming language”; s1.swap(s2); cout<<“s1 after swap:”<<s1<<endl; cout<<“s2 after swap:”<<s2; //Kết quả: //s1 after swap:c++ programming language //s2 after swap:introduction to programming
Hàm s1.insert(index, s2)
Thêm chuỗi s2 vào s1 sau vị trí index.
string s1 = “introduction to programming”; string s2 = “c++ programming language”; s1.insert(10, s2); cout<<“s1 after insert s2:”<<s1; //Kết quả: //s1 after insert s2:introductic++ programming languageon to programming
IV. Tính Độ Dài String Trong C++
Hướng dẫn cách lấy độ dài string trong C++. Bạn sẽ học được cách dùng hàm size và hàm length để lấy độ dài string trong C++ sau bài học này.
Độ dài string trong C++ là gì
Độ dài string trong C++ chính là số ký tự chứa trong string đó. Độ dài string trong C++ có thể lấy được bằng cách chia kích thước của string cho kích thước 1 phần tử trong string đó.
Độ dài string (số phần tử) = [Kích thước string] / [Kích thước kiểu char]
Do phần tử tạo nên string là các ký tự thuộc dạng char với kích thước là 1 byte, nên thông thường, chúng ta coi độ dài string trong C++ chính bằng kích thước của string đó.
Lấy độ dài string trong C++ bằng hàm size và hàm length
Do thông thường độ dài string trong C++ chính bằng kích thước của string đó, nên bằng phương pháp tính ra kích thước string thì chúng ta có thể thu về ngay độ dài của string đó.
Và để tính kích thước string trong C++, chúng ta sẽ sử dụng một trong hai hàm đã học tại bài Lấy kích thước string trong C++.
Cách lấy độ dài string trong C++ như các ví dụ sau đây:
Ví dụ 1: lấy độ dài string trong C++ bằng hàm size
#include <iostream> #include <string> using namespace std; int main () { string str(“Hello world”); cout<<“Do dai string = kich thuoc string = “,str.size()<<endl; return 0; }//Do dai string = kich thuoc string = 11
Ví dụ 1: lấy độ dài string trong C++ bằng hàm length
#include <iostream> #include <string> using namespace std; int main () { string str(“Hello world”); cout<<“Do dai string = kich thuoc string = “<<str.length()<<endl; return 0; }//Do dai string = kich thuoc string = 11
Trường hợp độ dài string khác với số ký tự có trong string
Ở phần trên chúng ta đã biết với những chuỗi được tạo thành bởi các ký tự được biểu diễn bởi 1 mã ký tự, do kích thước của các ký tự như vậy cũng là 1 byte, nên kết quả tính độ dài string bằng 2 hàm size và length cũng chính là số ký tự có trong string đó.
Tuy nhiên trong trường hợp chuỗi được tạo ra bởi các ký tự được biểu diễn bởi 2 mã ký tự như là tiếng Việt có dấu, hay kanji tiếng Nhật chẳng hạn, thì độ dài string sẽ lớn hơn số ký tự có trong string. Ví dụ:
#include <iostream> #include <string> using namespace std; int main () { string str(“Hà Nội”); cout<<str.size()<<endl; string str2(“東京”); cout<<str2.size()<<endl; return 0; }
Kết quả:
9 6
Có thể thấy rõ độ dài chuỗi trong các trường hợp này sẽ lớn hơn số ký tự có trong chuỗi đó.
Bởi vậy lúc dùng 2 hàm này để lấy số ký tự có trong string, cần hết sức chú ý trong trường hợp tồn tại ký tự được tạo thành bởi 2 mã ký tự như trên.
V. Cắt String Trong C++
Hướng dẫn phương pháp cắt string trong C++. Bạn sẽ học được cách sử dụng 3 hàm cơ bản như front(), back() và substr() để cắt string trong C++ sau bài học này.
Chúng ta có 3 phương pháp cơ bản để cắt string trong C++ như sau:
- Hàm front(): Cắt ký tự trước tiên từ string
- Hàm back(): Cắt ký tự cuối cùng từ string
- Hàm substr(): Cắt một phạm vi từ string
Cắt ký tự trước tiên từ string trong C++ bằng hàm front
Hàm front là 1 hàm thành viên trong class std:string, có tác dụng tham chiếu tới ký tự đầu tiên trong chuỗi string.
Bằng cách ứng dụng hàm front(), chúng ta không những có thể cắt ra giá trị của ký tự đầu tiên trong string, mà còn có thể thay đổi giá trị của ký tự đầu tiên đó.
Chúng ta sử dụng hàm front trong C++ với cú pháp sau đây:
str.front();
Trong đó str là chuỗi string cần cắt ra ký tự ban đầu. Hàm front() sẽ trả về tham chiếu tới ký tự đầu tiên của chuỗi string, qua đó chúng ta có thể cắt lấy giá trị của ký tự đầu tiên này, hoặc là gán một ký tự khác để thay đổi nó.
Lưu ý chúng ta không dùng hàm front() cho chuỗi string trống nhé.
Ví dụ cụ thể:
#include <iostream> #include <string> using namespace std; int main() { string str = “Hello World!”; //Tạo tham chiếu tới vị trí ký tự đầu tiên của chuỗi string char frontstr = str.front(); cout << frontstr << endl; //Thay đổi ký tự đầu tiên str.front() = ‘K’; cout << str << endl; return 0; }
Kết quả:
H Kello World!
Cắt ký tự cuối cùng từ string trong C++ bằng hàm back
Ngược lại với hàm front() chính là hàm back().
Hàm back là 1 hàm thành viên trong class std:string, có tác dụng tham chiếu đến ký tự cuối cùng trong chuỗi string.
Bằng cách ứng dụng hàm back(), chúng ta không những có thể cắt ra giá trị của ký tự đầu tiên trong string, mà còn có thể thay đổi giá trị của ký tự cuối cùng đó.
Chúng ta dùng hàm back trong C++ với cú pháp sau đây:
str.back();
Trong đó str là chuỗi string cần cắt ra ký tự cuối cùng. Hàm back() sẽ trả về tham chiếu tới ký tự cuối cùng của chuỗi string, qua đó chúng ta có thể cắt lấy giá trị của ký tự cuối cùng này, hoặc là gán một ký tự khác để thay đổi nó.
Lưu ý chúng ta không dùng hàm back() cho chuỗi string trống nhé.
Ví dụ cụ thể:
#include <iostream> #include <string> using namespace std; int main() { string str = “Hello World!”; //Tạo tham chiếu tới vị trí ký tự cuối cùng của chuỗi string char backstr = str.back(); cout << backstr << endl; //Thay đổi ký tự cuối cùng. str.back() = ‘?’; cout << str << endl; return 0; }
Kết quả:
! Hello World?
Cắt một phạm vi từ string bằng hàm substr()
Chúng ta sử dụng hàm substr() để cắt một phạm vi chỉ định từ trong string ban đầu. Ví dụ cụ thể:
#include <iostream> #include <string> using namespace std; int main() { string str = “Hello World!”; string substr = str.substr(1, 3); cout << substr << endl; string substr2 = str.substr(1,6); cout << substr2 << endl; return 0; }
Kết quả, các chuỗi string được cắt trong phạm vi chỉ định như sau:
ell ello W
VI. Nối Chuỗi String Trong C++
Bài tập C++: Nối chuỗi trong C++
Đề bài: Viết chương trình C++ để nối 2 chuỗi trong C.
Bài tập C++ này có nhiều cách gọi: trộn hai chuỗi, nối hai chuỗi, ghép hai chuỗi hay cộng hai chuỗi, … Dù có nhiều cách gọi khác nhau đi chăng nữa thì đây cũng chỉ là một bài tập để nối ghép các ký tự của hai chuỗi để thành một chuỗi duy nhất.
Lời giải (không sử dụng hàm)
Để giải bài tập C++ này, bạn sử dụng hàm strlen() để tìm độ dài chuỗi. Sử dụng vòng lặp để lặp qua tất cả ký tự của chuỗi.
Dưới đây là chương trình C++ để giải bài tập nối chuỗi trong C++:
#include <stdio.h> #include <string.h> int main() { char s1[10] = “VietTuts”; char s2[] = “.Vn”; int i, j, n1, n2; n1 = strlen(s1); n2 = strlen(s2); j=0; for(i = n1; i<n1+n2; i++ ) { s1[i] = s2[j]; j++; } s1[i] = ”; printf(“nKet qua sau khi noi chuoi la:n”); printf(“%s”, s1); return 0; }
Chạy chương trình C++ trên cho kết quả như sau:
Lời giải (sử dụng hàm)
Bạn có thể thực hiện nối hai chuỗi thành một chuỗi bởi sử dụng các hàm strcpy() và strcat() trong C.
Giả sử bạn cần nối hai chuỗi là str1 và str2. Bạn cần khai báo thêm một chuỗi str3 có độ dài bằng tổng độ dài của str1 và str2. Sau đó:
Sử dụng hàm strcpy(str3, str1) để sao chép chuỗi str1 vào str3.
Sử dụng hàm strcat(str3, str2) để nối chuỗi str2 với str1 vừa được sao chép.
Dưới đây là chương trình C++ để giải bài tập nối chuỗi trong C++:
#include<stdio.h> #include<string.h> int main() { char str1[100]; char str2[100]; char str3[100]; int len; printf(“Nhap chuoi 1: “); gets(str1); printf(“Nhap chuoi 2: “); gets(str2); strcpy(str3, str1); strcat(str3, str2); printf(“nNoi chuoi: %s”, str3); return (0); }
VII. So Sánh 2 String Trong C++
Bài tập C++: So sánh hai chuỗi trong C++
Đề bài: Viết chương trình C++ để sa sánh hai chuỗi.
Yêu cầu bài tập C++ này là so sánh xem hai chuỗi có đồng nhất (giống nhau) hay không. Để giải bài tập C++ này bạn cần sử dụng vòng lặp để duyệt qua tất cả các ký tự của hai chuỗi và kiểm tra từng ký tự tương ứng với chỉ mục có giống nhau không.
Lời giải
Dưới đây là chương trình C++ để giải bài tập so sánh 2 chuỗi trong C++:
#include <stdio.h> int main() { char s1[50]; char s2[50]; int n = 0; short flag = 1; printf(“Nhap chuoi s1: “); gets(s1); printf(“Nhap chuoi s2: “); gets(s2); // so sanh chuoi s1 voi s2 while (s1[n] != ”) { if(s1[n] != s2[n]) { flag = 0; break; } n++; } if(flag == 1) { printf(“Chuoi %s va chuoi %s la giong nhau.”, s1, s2); }else { printf(“Chuoi %s va chuoi %s la khac nhau.”, s1, s2); } return 0; }
VIII. Xóa 1 Ký Tự Trong String C++
Hướng dẫn cách xóa string trong C++. Bạn sẽ học được cách sử dụng các hàm như hàm pop_back, hàm erase để xóa string trong C++ sau bài học này.
Chúng ta có 3 phương pháp để xóa string trong C++ như sau:
- Hàm pop_back : Xóa ký tự cuối cùng trong string
- Hàm erase: Xóa ký tự tại vị trí chỉ định
- Hàm erase(first, last): Xóa các ký tự trong phạm vi chỉ định
Xóa ký tự cuối cùng trong string C++ bằng pop_back
Hàm pop_back là một hàm thành viên trong class std:string, có tác dụng xóa ký tự cuối cùng trong string cũng như giảm độ dài của nó đi một đơn vị.
Cú pháp sử dụng hàm pop_back để xóa ký tự cuối cùng trong string như sau:
str.pop_back();
Trong đó str là tên string cần xóa ký tự cuối cùng. Lưu ý là ký tự cuối cùng ở đây không bao gồm ký tự kết thúc chuỗi .
Hàm pop_back thuộc kiểu void, do đó nó sẽ không trả giá trị. Bởi vậy nó sẽ xóa ký tự cuối cùng trong string chứ không trả về ký tự đó. Trong trường hợp muốn lấy ký tự cuối cùng trong string, hãy sử dụng tới hàm back để thay thế.
Ví dụ cụ thể:
#include <iostream> #include <string> int main () { std::string str (“Hello world”); str.pop_back(); std::cout << str; return 0; } //> Hello worl
Có thể thấy ký tự cuối cùng trong chuỗi là ký tự d đã bị xóa khỏi chuỗi ban đầu.
Xóa 1 ký tự trong string bằng hàm erase
Hàm erase là một hàm thành viên trong class std:string, có tác dụng xóa một hoặc nhiều ký tự trong string C++ cũng như làm giảm độ dài tương ứng của nó.
Để xóa 1 ký tự tại vị trí chỉ định trong string C++ bằng hàm erase chúng ta sử dụng cú pháp sau đây:
str.erase(p);
Ở đây trình lặp (iterator) là một vòng lặp có tác dụng giống như con trỏ, giúp truy cập đến các ký tự ở vị trí cụ thể trong string.
Trong trường hợp cần chỉ đến vị trí index thứ n trong string, chúng ta sẽ viết trình lặp p như sau:
str.begin() + i
Trong đó str.begin() chỉ đến vị trí đầu tiên trong string, và i là index của vị trí ký tự cần chỉ đến.
Kết hợp lại thì công thức để xóa 1 ký tự vào vị trí chỉ định trong string C++ bằng hàm erase sẽ như sau:
str.erase(str.begin() + i);
Ví dụ cụ thể:
#include <iostream> #include <string> using namespace std; int main () { string str(“Hello World”); str.erase(str.begin() + 2);//Xóa ký tự ở vị trí thứ 2 cout << str<<endl; str.erase(str.begin() + 6);//Xóa ký tự ở vị trí thứ 6 cout << str; return 0; }
Kết quả:
Helo World Helo Wrld
Xóa các ký tự trong một phạm vi chỉ định trong string C++
Chúng ta sử dụng hàm erase để xóa các ký tự trong một phạm vi chỉ định trong string C++ với cú pháp sau đây:
str.erase( iterator_first, iterator_last);
Trong đó str là chuỗi ban đầu, iterator_first và iterator_last là phạm vi cần xóa được chỉ định trong trình lặp trỏ đến vị trí cần xóa trong string.
Tương tự như khi xóa 1 ký tự thì cú pháp sử dụng thực tế để xóa các ký tự trong một phạm vi chỉ định trong string C++ bằng hàm erase sẽ là:
str.erase(str.begin() + start, str.begin() + end);
Trong đó start và end là vị trí index của phạm vi xóa trong string.
Ví dụ cụ thể:
#include <iostream> #include <string> using namespace std; int main () { string str(“Hello World”); //Xóa ký tự trong phạm vi index từ 1 đến 3 str.erase(str.begin() + 1, str.begin() + 3); cout << str<<endl; //Xóa ký tự trong phạm vi index từ 2 đến 5 str.erase(str.begin() + 2, str.begin() +5); cout << str; return 0; }
Kết quả:
Hlo World Hlorld
IX. Bài Tập Về String Trong C++
C++ cung cấp hai kiểu biểu diễn chuỗi như sau:
Chuỗi theo phong cách của ngôn ngữ C (C-style),
Lớp Chuỗi (String) được giới thiệu trong C/C++ chuẩn.
Chuỗi theo phong cách C
Dạng chuỗi này bắt nguồn từ ngôn ngữ C và tiếp tục được hỗ trợ trong C/C++. Chuỗi trong ngôn ngữ lập trình C thực chất là mảng một chiều của các ký tự mà kết thúc bởi một ký tự null ‘’.
Phần khai báo và khởi tạo dưới đây tạo ra một chuỗi bao gồm một từ “Hello”. Để giữ các giá trị null tại cuối của mảng, cỡ của mảng các ký tự bao gồm một chuỗi phải nhiều hơn số lượng các ký tự trong từ khóa “Hello”.
char loiChao[6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ”};
Nếu bạn theo quy tắc khởi tạo các chuỗi, bạn có thể viết lệnh như sau:
char loiChao[] = “Hello”;
Dưới đây là phần biểu diễn ô nhớ cho đoạn chuỗi trên trong ngôn ngữ C/C++:
Thực tế, bạn không đặt ký tự null tại vị trí cuối cùng của biến hằng số. Bộ biên dịch C tự động thêm ‘’ tại ví trí cuối cùng của chuỗi khi nó khởi tạo chuỗi. Cùng thử ví dụ in ra chuỗi sau đây:
#include <iostream> using namespace std; int main () { char loiChao[6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ”}; cout << “Khi gap nhau, chung ta noi: “; cout << loiChao << endl; return 0; }
Khi đoạn code trên được biên dịch và thực hiện, kết quả in ra sẽ như sau:
Khi gap nhau, chung ta noi: Hello
Ngôn ngữ C/C++ hỗ trợ nhiều hàm đa dạng để thao tác các chuỗi kết thúc là null:
STT Hàm & Mục đích 1 strcpy(s1, s2);Sao chép chuỗi s2 cho chuỗi s1. 2 strcat(s1, s2);Nối chuỗi s2 vào cuối chuỗi s1. 3 strlen(s1);Trả về độ dài của chuỗi s1. 4 strcmp(s1, s2);Trả về 0 nếu s1 và s2 là như nhau; nhỏ hơn 0 nếu s1<s2; lớn hơn 0 nếu s1>s2. 5 strchr(s1, ch);Trả về con trỏ tới vị trí đầu tiên của ch trong s1. 6 strstr(s1, s2);Trả về con trỏ tới vị trí đầu tiên của chuỗi s2 trong chuỗi s1.
Dưới đây là ví dụ cho việc sử dụng một vài hàm bên trên:
#include <iostream> #include <cstring> using namespace std; int main () { char chuoi1[10] = “Hello”; char chuoi2[10] = “Christmas”; char chuoi3[10]; int len ; // sao chep chuoi1 vao trong chuoi3 strcpy( chuoi3, chuoi1); cout << “strcpy( chuoi3, chuoi1) : ” << chuoi3 << endl; // noi hai chuoi: chuoi1 va chuoi2 strcat( chuoi1, chuoi2); cout << “strcat( chuoi1, chuoi2): ” << chuoi1 << endl; // tong do dai cua chuoi1 mot sau khi thuc hien noi chuoi len = strlen(chuoi1); cout << “Dung ham strlen(chuoi1) de tinh do dai chuoi1: ” << len << endl; return 0; }
Chạy chương trình C/C++ trên sẽ cho kết quả như hình sau:
Lớp String trong C/C++
Thư viện chuẩn C/C++ cung cấp một kiểu lớp String mà hỗ trợ tất cả hoạt động liên quan tới chuỗi đã đề cập ở trên, và bổ sung thêm nhiều tính năng nữa. Chúng ta sẽ học lớp này trong Thư viện chuẩn C/C++ (C++ Standard Library), nhưng lúc này, chúng ta xem xét ví dụ sau:
Lúc này, có thể bạn không hiểu ví dụ này, bởi vì chúng ta chưa bàn luận về Lớp và Đối tượng trong C/C++. Vì thế, bạn quan sát và ghi nhớ chúng tới khi bạn đã hiểu các khái niệm về Hướng đối tượng được trình bày ở chương sau đó.
#include <iostream> #include <string> using namespace std; int main () { string chuoi1 = “Hello”; string chuoi2 = “Christmas”; string chuoi3; int len ; // sao chep chuoi1 vao trong chuoi3 chuoi3 = chuoi1; cout << “Bay gio chuoi3 la: ” << chuoi3 << endl; // noi hai chuoi: chuoi1 va chuoi2 chuoi3 = chuoi1 + chuoi2; cout << “chuoi1 + chuoi2 co ket qua la: ” << chuoi3 << endl; // tong do dai cua chuoi3 mot sau khi thuc hien noi chuoi len = chuoi3.size(); cout << “Tinh do dai voi ham chuoi3.size() : ” << len << endl; return 0; }
Chạy chương trình C/C++ trên sẽ cho kết quả như hình sau:
X. Chuẩn Hóa String Trong C++
Chuẩn hóa chuỗi trong C
Ý tưởng chuẩn hóa chuỗi trong C như sau:
- Bỏ các ký tự khoảng trắng thừa ở đầu chuỗi
- Bỏ các ký tự khoảng trắng thừa ở cuối chuỗi
- Viết hoa chữ cái đầu tiên của chuỗi
- Bỏ qua các khoảng trắng thừa ở giữa
- Đưa tất cả về lowercase
- Viết hoa chữ cái bắt đầu từ theo ý tưởng đếm từ phía trên
void Correct(char str[], int length) { int first = 0, last = length – 1; // Xóa dấu trắng đầu chuỗi while (first < last && str[first] == ‘ ‘) first++; // Xóa dấu trắng cuối chuỗi while (last > first && str[last] == ‘ ‘) last-; // Viết hoa chữ cái đầu tiên if (str[first] >= ‘a’ && str[first] <= ‘z’) str[first] -= 32; for (int i = first + 1; i <= last; i++) { // Đưa hết về chữ thường if (str[i] >= ‘A’ && str[i] <= ‘Z’){ str[i] += 32; } if (i + 1 <= last) { // Bỏ dấu trắng thừa ở giữa if (str[i] == str[i + 1] && str[i] == ‘ ‘) { continue; } // Nếu là chữ cái đầu mỗi từ thì viết hoa if (str[i] == ‘ ‘ && str[i + 1] >= ‘a’ && str[i + 1] <= ‘z’) { str[i + 1] -= 32; } } printf(“%c”, str[i]); } }
Lời giải chuẩn hóa chuỗi và đếm số từ trong C
#include <stdio.h> #include <string.h> int WordCount(char str[], int length) { int word = (str[0] != ‘ ‘); for (int i = 0; i < length – 1; i++) { if (str[i] == ‘ ‘ && str[i + 1] != ‘ ‘) { word++; } } return word; } void Correct(char str[], int length) { int first = 0, last = length – 1; // Xóa dấu trắng đầu chuỗi while (first < last && str[first] == ‘ ‘) first++; // Xóa dấu trắng cuối chuỗi while (last > first && str[last] == ‘ ‘) last-; // Viết hoa chữ cái đầu tiên if (str[first] >= ‘a’ && str[first] <= ‘z’) str[first] -= 32; for (int i = first + 1; i <= last; i++) { // Đưa hết về chữ thường if (str[i] >= ‘A’ && str[i] <= ‘Z’){ str[i] += 32; } if (i + 1 <= last) { // Bỏ dấu trắng thừa ở giữa if (str[i] == str[i + 1] && str[i] == ‘ ‘) { continue; } // Nếu là chữ cái đầu mỗi từ thì viết hoa if (str[i] == ‘ ‘ && str[i + 1] >= ‘a’ && str[i + 1] <= ‘z’) { str[i + 1] -= 32; } } printf(“%c”, str[i]); } } int main() { char str[100]; // Nhập chuỗi printf(“nNhap chuoi: “); fgets(str, sizeof str, stdin); // Do sử dụng fgets nên chuỗi của chúng ta sẽ đọc cả ký tự ‘n’. // Xóa bỏ nó đi. int length = strlen(str) – 1; str[length] = ”; printf(“So tu cua “%s” la %d”, str, WordCount(str, length)); printf(“nXau chuan hoa la: “); Correct(str, length); }
Kết quả chạy thử:
PS G:c_courcesday_61> g++ .ChuanHoa.cpp -o .ChuanHoa PS G:c_courcesday_61> .ChuanHoa.exe Nhap chuoi: LAP trINH khong KHO! So tu cua ” LAP trINH khong KHO!” la 4 Xau chuan hoa la: Lap trinh khong kho