Trần Lê Hùng Phi – Xâu

Ví dụ sau đây sử dụng các hàm trên:

  1. #include <iostream>

  2. #include <cstring>

  3. using namespace std;

  4. int main ()

  5. {

  6. char str1[ 10] = “Hello”;

  7. char str2[ 10] = “World”;

  8. char str3[ 10];

  9. int len ;

  10. // copy str1 into str3

  11. strcpy( str3, str1);

  12. cout << “strcpy( str3, str1) : ” << str3 << endl;

  13. // concatenates str1 and str2

  14. strcat( str1, str2);

  15. cout << “strcat( str1, str2): ” << str1 << endl;

  16. // total lenghth of str1 after concatenation

  17. len = strlen(str1);

  18. cout << “strlen(str1) : ” << len << endl;

  19. return 0;

  20. }

chạy chương trình trên kết quả như sau:

  1. strcpy( str3, str1) : Hello

  2. strcat( str1, str2): HelloWorld

  3. strlen(str1) : 10

Dùng lớp string

Để dùng lớp này các em khai báo thêm thư viên string

Khi đã dùng đến thư viện này, các thao tác nhập xuất giống với dùng mảng kí tự, nhưng một số thao tác trên xâu lại đơn giản hóa hơn rất nhiều, cách thực hiện các thao tác của xâu cũng tường minh và dễ hiểu hơn nhiều. Các em quan sát ví dụ sau đây để thấy cách sử dụng lớp string này trong C++ nhé.

  1. #include <iostream>

  2. #include <string>

  3. using namespace std;

  4. int main ()

  5. {

  6. string str1 = “Hello”;

  7. string str2 = “World”;

  8. string str3;

  9. int len ;

  10. // copy str1 into str3

  11. str3 = str1;

  12. cout << “str3 : ” << str3 << endl;

  13. // concatenates str1 and str2

  14. str3 = str1 + str2;

  15. cout << “str1 + str2 : ” << str3 << endl;

  16. // total lenghth of str3 after concatenation

  17. len = str3. size();

  18. cout << “str3.size() : ” << len << endl;

  19. return 0;

  20. }

Chạy chương trình trên kết quả như sau:

  1. str3 : Hello

  2. str1 + str2 : HelloWorld

  3. str3. size() : 10

Truy xuất ky tự trong xâu

– Mỗi ký tự của xâu còn gọi là một phần tử của xâu.

– Mỗi ký tự có một chỉ số (được đánh bắt đầu từ 0).

– Để Truy vuất vào một phần tử nào đó, ta dựa vào chỉ số của nó.

Ví dụ:

Với xâu Str3 = “Hello” ở trên,

Str3[0] = ‘H’

Str3[1] = ‘e’

….

Nhập xâu với String

Thao tác nhập xâu với lớp String đơn giản và hiệu quả nhất là dùng hàm getline.

Cú pháp hàm này như sau:

getline(cin, tên xâu);

Ví dụ:

// extract to string#include <iostream>#include <string>int main () { std::string name; std::cout << “Please, enter your full name: “; std::getline (std::cin,name); std::cout << “Hello, ” << name << “!\n”; return 0; }

Chạy chương trình trên các em sẽ thấy kết quả như sau:

Please, enter your full name: chao ban Hello, chao ban!

Lấy độ dài xâu với String

Cách lấy độ dài của một xâu trong lớp String chúng ta dùng hàm length()

Cú pháp: <Tên xâu>.length();

Ví dụ

// string::length#include <iostream>#include <string> using namespace std; int main () { string str (“Test string”); cout << “The size of str is ” << str.length() << ” bytes.\n”; return 0; }

Chạy chương trình được kết quả như sau:

The size of str is 11 bytes

Ghép xâu

Là thao tác ghép hai xâu lại với nhau thành một xâu dài hơn. Trong C++ chúng ta có thể dùng toán tử ‘+’ để thực hiện điều này.

Ví dụ:

#include <iostream>#include <string> using namespace std; int main () { string S1; string S2, S3;

S1 = “Duong”;

S2 = “Ngo Quyen”;

S3 = S1 + S2;

cout<<S3; return 0;

}

Chạy chương trình kết quả ra màn hình là:

DuongNgo Quyen

Bài tập nhỏ 1:

Em hãy sửa lại chương trình trên một chút để kết quả S3 là “Duong Ngo Quyen”

Bài tập nhỏ 2:

Em hãy viết chương cho phép nhập vào hai xâu S1, S2. Xâu S3 = S1+S2. Xuất ra S3 và độ dài của S3 trên 2 dòng khác nhau.

Copy một phần trong xâu

là thao tác lấy một đoạn nào đó trong một xâu lớn để gán cho xâu khác.

Đối với lớp String trong C++, thao tác này thực hiện thông qua hàm substr(vị trí, số ký tự)

Cú Pháp: <xâu con> = <tên xâu mẹ>.substr( vị trí bắt đầu lấy, số ký tự muốn lấy);

Ví dụ:

// string::substr

#include <iostream>

#include <string>

using namespace std;

int main ()

{

string str=”We think in generalities, but we live in details.”;

string str2 = str.substr (3,5); // “think”

cout << str2 << ‘\n’;

return 0;

}

Ví dụ trên copy đoạn 5 ký tự bắt đầu từ ký tự thứ 3 trong xâu str rồi gán vào cho str2.

Bài tập nhỏ 3:

khai báo thêm một xâu tên str3, dùng lệnh substr() lấy chữ “generalities” của str gán cho str3, xuất str3 ra màn hình.

Chèn xâu

Chèn một xâu này vào xâu khác tại một vị trí chỉ định nào đó.

Đối với lớp String của C++, thao tác này được thực hiện thông qua thủ tục insert()

Cú pháp: <Tên xâu mẹ>.insert( vị trí bắt đầu chèn, tên xâu con);

ý nghĩa: Chèn xâu con vào vị trí bắt đầu chèn trong xâu mẹ.

Ví dụ:

// inserting into a string#include <iostream>#include <string> using namespace std; int main () { string str=”to be question”; string str2=”the “; string str3=”or not to be”; // used in the same order as described above: str.insert(6,str2); // to be (the )question str.insert(6,str3,3,4); // to be (not )the question str.insert(10,”that is cool”,8); // to be not (that is )the question str.insert(10,”to be “); // to be not (to be )that is the question str.insert(15,1,’:’); // to be not to be(:) that is the question it = str.insert(str.begin()+5,’,’); // to be(,) not to be: that is the question str.insert (str.end(),3,’.’); // to be, not to be: that is the question(…) str.insert (it+2,str3.begin(),str3.begin()+3); // (or ) std::cout << str << ‘\n’; return 0; }

Chạy chương trình trên cho kết quả như sau:

to be, or not to be: that is the question…

Bài tập nhỏ 4:

Viết chương trình gán xâu S1 = “Hung Vuong”; xâu S2 = “Duong”. Hãy gán S2 vào S1 sao cho S1 trở thành “Duong Hung Vuong”

Xóa kí tự trong xâu

Là thao tác xóa bớt một số ký tự trong xâu cho trước. Trong C++, thao tác này thực hiện bằng thủ tục erase.

Cú pháp: <Tên xâu>.erase(vị trí bắt đầu xóa, số ký tự muốn xóa)

Ví dụ:

// string::erase#include <iostream>#include <string> using namespace std; int main () { string str (“This is an example sentence.”); cout << str << ‘\n’; // “This is an example sentence.” str.erase (10,8); // ^^^^^^^^ cout << str << ‘\n’; // “This is an sentence.” str.erase (str.begin()+9); // ^ cout << str << ‘\n’; // “This is a sentence.” str.erase (str.begin()+5, str.end()-9); // ^^^^^ cout << str << ‘\n’; // “This sentence.” return 0; }

Chạy chương trình trên ta được output như sau:

This is an example sentence. This is an sentence. This is a sentence. This sentence.

Bài tập nhỏ 5

Viết chương trình gán xâu S3 = “Duong An Duong Vuong”;

Thực hiện lện xóa để biến S3 thành “Duong An Vuong”. Xuất S3 ra màn hình.

Tìm vị trí xâu nhỏ trong xâu lớn

Nếu muốn tìm xem một xâu nào đó xuất hiện trong xâu lớn ở vị trí đầu tiên nào, C++ cung cấp cho ta hàm find.

Cú pháp: Vị trí = <tên xâu lớn>.find( tên xâu nhỏ);

Trongđó Vị trí là một biến kiểu nguyên.

Ví dụ:

int main ()

{

string str (“There are two needles in this haystack with needles.”);

string str2 (“needle”);

int found;

// different member versions of find in the same order as above:

found = str.find(str2);

if (found!=string::npos)

cout << “first ‘needle’ found at: ” << found << ‘\n’;

found=str.find(“needles are small”,found+1,6);

if (found!=string::npos)

cout << “second ‘needle’ found at: ” << found << ‘\n’;

found=str.find(“haystack”);

if (found!=string::npos)

cout << “‘haystack’ also found at: ” << found << ‘\n’;

found=str.find(‘.’);

if (found!=string::npos)

cout << “Period found at: ” << found << ‘\n’;

// let’s replace the first needle:

str.replace(str.find(str2),str2.length(),”preposition”);

std::cout << str << ‘\n’;

return 0;

}

Giải thích:

– string::npos: là vị trí không tồn tại, hoặc vị trí ở một ô nhớ rất xa trong bộ nhớ, ý nghĩa việc so sánh này là nếu tìm được vị trí của xâu con trong xâu mẹ.

Chạy chương trình trên cho ta kết quả:

first ‘needle’ found at: 14 second ‘needle’ found at: 44 ‘haystack’ also found at: 30 Period found at: 51

There are two prepositions in this haystack with needles.

Bài tập nhỏ 6:

Viết một chương trình ngắn cho phép người dùng nhập vào hai xâu S1, S2. Tìm vị trí của S2 trong S1 rồi xuất vị trí này ra màn hình. Nếu không tìm được thì xuất ra -1.

Ví dụ: