Chào các bạn học viên vẫn theo dõi khóa huấn luyện và đào tạo lập trinh trực tuyến ngôn ngữ C++.

Bạn đang xem: Chuỗi (string) trong c

Trong những bài học trước, mình đã hướng dẫn chúng ta thực hiện một số thao tác đơn giản dễ dàng với C-style string, hay còn gọi là mảng kí tự.

Để thao tác làm việc với mảng kí tự, chúng ta cần include tủ sách cstring vào chương trình để được cung cấp một số hàm sẵn có. Tuy vậy, câu hỏi xử lý mảng kí tự vẫn tồn tại nhiều cạnh tranh khăn. Một ví dụ điển hình là việc bạn triển khai nối chuỗi kí tự bằng hàm strcat. Bạn luôn luôn phải để vai trung phong đến việc con số ô nhớ mà bạn đã cấp phép cho mảng kí tự bao gồm đủ để chứa thêm chuỗi kí từ được nối vào không. Tuyệt là khi chúng ta khai báo một mảng kí tự, chúng ta cũng phải đề ra câu hỏi: Liệu bao nhiêu ô đừng quên đủ? Và các bạn phải luôn đặt kí trường đoản cú "" tại vị trí xong chuỗi kí tự... Vô số thứ khiến cho bạn phải để tâm.

Trong bài học kinh nghiệm hôm nay, bản thân sẽ ra mắt với các bạn về kiểu tài liệu string được có mang trong tủ sách string của ngữ điệu C++ (các chúng ta đừng nhầm lẫn thân thư viện cstring của ngữ điệu C với tủ sách string của ngôn ngữ C++, nhì thư viện này trọn vẹn riêng biệt).

Các chúng ta có thể làm được gì với thư viện string mà ngữ điệu C++ cung cấp? Trước hết, họ hãy thuộc xem tủ sách string là gì, với nó chứa đều gì bên trong.

chuyenly.edu.vn-Style string

Mình tạm call là chuyenly.edu.vn-style string để tiện rành mạch với C-style string mà chúng ta đã học tập trong một số trong những bài học trước.

string là một trong lớp chuẩn chỉnh mô tả về về chuỗi kí tự, nó hỗ trợ khả năng lưu trữ chuỗi kí tự hotline là standard container, và cung ứng đó một số cụ thể được thiết kế để cách xử trí chuỗi kí tự nhưng mà nó sẽ lưu trữ.

*

Một ưu điểm mà lớp string đem đến cho chúng ta là standard container có thể tự biến hóa kích thước vùng lưu giữ cho cân xứng với yêu cầu về mặt tàng trữ chuỗi kí tự. Do đó, các bạn có thể tùy ý nối hoặc chèn thêm tài liệu vào standard container cho đến khi dung lượng bộ nhớ không đầy đủ để cung cấp nữa.

Khai báo với khởi tạo

Tương từ bỏ như cách chúng ta khai báo đổi thay thông thường, hình dạng dữ liệu sẽ được dùng trong bài học kinh nghiệm này là string (Các bạn cần include thư viện string vào trước lúc sử dụng).

#include using namespace std;//.........string my_string;Lớp string cũng rất được đặt trong namespace std phải dòng lệnh using namespace std là phải thiết.

Vậy là bọn họ đã khai báo được một đối tượng có tên là my_string tự lớp string. Các bạn có thể khởi sinh sản chuỗi kí tự cho đối tượng người dùng tại thời gian khai báo bằng một số cách như sau:

string empty_string();string my_string = "Learning C++ is easy";string another_string("Don"t give it up");string temp_string("What the hell is going on?");string one_more = temp_string;string it_just_began(temp_string);Chúng ta có thể khởi tạo bằng cách gán cho đối tượng người sử dụng một chuỗi kí tự thông qua toán tử gán "=" hoặc mang chuỗi kí tự từ một đối tượng người tiêu dùng của lớp string khác, với còn vô số phương pháp nữa.

string input đầu vào & output

Output:

Để gửi dữ liệu bên trong standard container của string ra screen console, chúng ta sử đụng đối tượng người sử dụng cout như cách chúng ta vẫn thường xuyên dùng, chỉ việc sử dụng tên biến của đối tượng người sử dụng string.

string output_string = "I"m learning C++ programming language";cout << output_string << endl;Input:

Chúng ta hoàn toàn có thể sử dụng đối tượng người tiêu dùng cin nhằm nhập tài liệu vào từ keyboard cho những đối tượng của lớp string.

string input_string;cout << "Please enter your command: ";cin >> input_string;Với cách nhập tài liệu này, chúng ta lại gặp phải trường hợp tài liệu truyền vào string bị dừng khi chạm chán kí tự khoảng chừng trắng.

*

Trong một số trong những trường hợp, họ chỉ yêu cầu người dùng nhập 1 từ thì rất có thể sử dụng đối tượng người tiêu dùng cin như bí quyết trên, ví dụ:

string command;docout << "Enter "new" lớn create a new file." << endl;cout << "Enter "cancel" to discard the previous behavior." << endl;cout << "Enter "quit" khổng lồ exit the program." << endl;cout << "=============================================" << endl;cout << "Enter your command: ";cin >> command;cout << "=============================================" << endl;//do something depend on the command while (true);Nhưng trong một vài trường hợp, chúng ta cần string nhận vào kí tự khoảng chừng trắng, ví dụ khi nhập họ tên đầy đủ, thì bọn họ cần có một cách khác.

Để hạn chế và khắc phục trường vừa lòng string không nhận kí tự khoảng tầm trắng, chúng ta sử dụng hàm getline được định nghĩa bên phía trong thư viện string.

string name;cout << "Enter your full name: ";getline( cin, name );Mình truyền vào getline đối tượng người sử dụng cin để nhận dữ liệu từ bàn phím, khi nên nhận tài liệu từ tệp tin thì mình đang truyền vào đối số đầu tiên một đối tượng người dùng có loại file stream (phần này các bạn sẽ được học tập sau).

Bây giờ thì bạn có thể nhập tài liệu mà không trở nên giới hạn vày kí tự khoảng trắng nữa.

*

Hàm getline mặc định xem kí trường đoản cú " " được tạo ra khi thừa nhận phím Enter là kí tự ngừng nhập dữ liệu cho string. Chúng ta cũng có thể thay thay đổi điều này.

Hàm getline có thể nhận thêm đối số thiết bị 3 thay mặt cho kí tự xong nhập tài liệu cho string. Ví dụ:

string str;cout << "Enter a string (end by a dot): " << endl;getline(cin, str, ".");cout << str << endl;Đoạn công tác trên khiến cho chương trình tạm dừng và chờ cho đến khi quá trình nhập dữ liệu của người sử dụng kết thúc, nó chỉ chấm dứt khi phạt hiện lốt chấm.

*

String manipulating

Mình vừa hướng dẫn chúng ta cách khai báo mà thực hiện kiểu dữ liệu string của ngữ điệu C++, tiếp theo sau là phần làm việc với standard container của một đối tượng người tiêu dùng string.

Tính độ nhiều năm chuỗi kí tự được lưu lại trong standard container

Lớp string khái niệm cho họ 2 cách thức để triển khai việc kéo ra độ dài của chuỗi kí tự được lưu trong standard container.

string my_favorite_quote = "By my will, this shall be finished";cout << "Length of the quote: " << my_favorite_quote.length() << endl;cout << "Length of the quote: " << my_favorite_quote.size() << endl;Hai cách làm length cùng size của lớp string số đông được dùng để tính độ lâu năm của chuỗi kí tự trong standard container.

Khi string có độ lâu năm chuỗi kí trường đoản cú là 0, nó được xem là string rỗng. Để bình chọn xem string gồm rỗng giỏi không, chúng ta sử dụng cách tiến hành empty, cách thức này trả về cực hiếm true lúc string rỗng, ngược lại, trả về cực hiếm false.

string empty_string = "";if(empty_string.empty())cout << "string is empty" << endl;Chúng ta cũng có thể làm một string gồm chứa dữ liệu trở thành string rỗng bằng phương thức clear.

string str = "This is a sample string".str.clear();if(str.empty())cout << "str is now empty" << endl;Truy cập thành phần trong stringCũng tựa như như bài toán truy cập bộ phận trong mảng kí tự, bọn họ sử dụng cặp lốt ngoặc vuông cùng truyền vào một trong những giá trị số nguyên thay mặt đại diện cho chỉ số của phần tử cần truy tìm xuất.

string str = "Learn from others people";for(int32_t index = 0; index <= str.length() - 1; index++)cout << str << " ";cout << endl;for(int32_t index = 0; index <= str.length() - 1; index++)cout << str.at(index) << " ";Phương thức at của lớp string cũng thực hiện truy xuất đến thành phần có chỉ số index tựa như cặp dấu ngoặc vuông.

Nếu lịch trình phát hiện hành vi truy xuất đến bộ phận có chỉ số không hợp lệ (index < 0 hoặc index >= string length), Assertion đang ép buộc chương trình hoàn thành và thông tin dòng lệnh tạo ra lỗi cho bạn.

2 cách truy cập bộ phận trên được dùng để làm truy xuất bộ phận có chỉ số không nạm định. Lớp tring còn cung ứng cho họ 2 cách tiến hành để truy xuất cấp tốc đến bộ phận đầu tiên và bộ phận cuối cùng của chuỗi kí tự vào standard container.

Xem thêm: Có Nên Dùng Phần Mềm Auto Fifa Online 4, Phần Mềm Auto Fifa Online 4

string sample = "Access khổng lồ the first và the last element";cout << "First: " << sample.front() << endl;cout << "Last: " << sample.back() << endl;Assertion để trong 2 cách tiến hành frontback sẽ tiến hành kích hoạt nếu như string rỗng.

Thay đổi tài liệu trong string

Có không ít phương thức được lớp string định nghĩa cần sử dụng để chuyển đổi dữ liệu vào standard container.

Nối thêm 1 kí tự vào sau string:

Chúng ta chỉ cần truyền vào cách làm push_back kí từ mà họ muốn tiếp tế sau chuỗi kí tự vào standard container.

string str = "A sentence must kết thúc with a dot";str.push_back(".");Xóa phần tử cuối cùng của string:

Ngược lại với cách tiến hành push_back sinh sống trên, thủ tục pop_back xóa đi kí tự sau cùng trong string. Nếu các bạn thực hiện cách tiến hành này khi string rỗng, lịch trình sẽ gây nên lỗi xung đột nhiên vùng nhớ, vì chưng thế, các bạn cần kiểm tra trước khi xóa.

string str = "The dot will be removed.";if(!str.empty())str.pop_back();Nối chuỗi kí tự vào sau string:

Chúng ta có thể sử dụng cách làm append của lớp string nhằm nối thêm 1 chuỗi kí từ vào sau chuỗi kí tự vào standard container.

string& append (const string& str);

string& append (const char* s);

Các bạn có thể truyền vào cách thức append một đối tượng người tiêu dùng có dạng hình string hoặc thương hiệu của một mảng kí tự như thế nào đó.

string str = "";str.append("Le");str.append(" ");str.append("Tran");str.append(" Dat");Bên cạnh đó, lớp string đã và đang định nghĩa lại toán tử nối chuỗi kí từ giúp chúng ta tiết kiệm thời hạn viết code hơn.

string str = "";str += "Use "+=" operator ";str += "to append string";Toán tử "+=" có công dụng hoàn toàn như thể với cách thức append.

Chèn một string vào vị trí bất kỳ trong string:

Phương thức insert rất có thể giúp chúng ta chèn một string vào vị trí pos.

string& insert (size_t pos, const string& str);

Ví dụ:

string str = "how khổng lồ use.";string str2 = "i will introduce you ";cout << str << endl;str.insert(0, str2);cout << str << endl;str.insert(str.length() - 1, " string in C++");cout << str << endl;Trong lần sử dụng phương thức insert đầu tiên, bản thân chèn str2 vào str tại địa điểm đầu tiên. Sau đó, bản thân chèn thêm 1 chuỗi kí tự tại địa chỉ str.length() - 1 (trước dấu chấm dứt câu).

Sử dụng phương thức insert với địa điểm chèn chưa hợp lệ sẽ gây ra lỗi xung tự dưng vùng nhớ.

Thay thế một phần của string:

Chắc các chúng ta có thể đoán được tên của cách tiến hành mà mình sẵn sàng nói tới. Cách làm replace dùng làm thay ráng một đoạn con của chuỗi kí tự lưu lại trong standard container bởi 1 string hoặc 1 mảng kí trường đoản cú khác.

string& replace (size_t pos, size_t len, const string& str);string& replace (size_t pos, size_t len, const char* s);Ở trên đó là 2 cách mà chúng ta thường dùng. Vào đó, pos là vị trí trong standard container mà bạn có nhu cầu thực hiện chũm thế, len là số lượng kí tự trong standard container mà bạn có nhu cầu thay, str là đoạn kí tự bắt đầu được ghép vào vào standard container.

Ví dụ:

string my_string = "This string will be replaced";cout << my_string << endl;my_string.replace(20, 8, "changed");cout << my_string << endl;Nhìn vào hiệu quả đoạn chương trình trên và tưởng tượng xem test điều gì vừa diễn ra.

*

Tại địa chỉ pos của string gốc, công tác xóa đi len kí tự, và chèn str vào string cội tại ví trí pos. Đó là cách mà cách thức replace hoạt động.

Tìm kiếm

Có các phương thức trong lớp string được định nghĩa cho các trường hòa hợp tìm tìm phức tạp. Mình chỉ hướng dẫn chúng ta sử dụng phương thức find của lớp string nhằm tìm tìm vị trí mở ra của chuỗi con phía bên trong đối tượng mà các bạn đang dùng để làm gọi phương thức find.

Ví dụ mình bao gồm string dùng để làm lưu một vài tên của những thành viên trong nhóm tiến hành tutorial này:

string name_list = "Le Tran Dat Nguyen Chiem Minh Vu Ngo Doan Tuan Le Dinh Huy";Thử in name_list ra màn hình:

*

Yêu cầu nhập vào một cái tên từ bàn phím và xác định xem thương hiệu đó gồm tồn tại trong danh sách trên xuất xắc không.

Sau đó là một số khai báo cách thức find trong lớp string vẫn giúp chúng ta giải quyết vấn đề mình vừa để ra.

size_t find (const string& str, size_t pos = 0) const;

Tìm tìm sự lộ diện của chuỗi nhỏ str bên trong standard container của đối tượng người dùng mà chúng ta dùng để gọi cách làm find, vị trí ban đầu tìm kiếm mặc định là 0.

string name;cout << "Enter a name: ";getline(cin, name);int32_t search_index = name_list.find(name);Nếu name được tìm thấy phía bên trong name_list, đổi mới search_index sẽ nhận được giá trị là chỉ sổ cơ mà name được tìm kiếm thấy. Còn nếu như không được tra cứu thấy, thay đổi search_index nhận cực hiếm -1.

if(search_index == -1)cout << name << " is not exist in name_list" << endl;elsecout << "Found at: " << search_index << endl;Phương thức find này dễ sử dụng hơn đối với việc sử dụng hàm strstr trong tủ sách cstring nhằm tìm tìm trong mảng kí tự.

So sánh 2 string

Phép đối chiếu 2 string cũng rất được thực hiện nay theo vật dụng tự từ bỏ điển (từ trái sang trọng phải) giống như khi đối chiếu hai mảng kí tự.

int compare (const string& str) const;

Hoặc

int compare (const char* s) const;

Phương thức so sánh compare trả về một cực hiếm số nguyên. Tương tự như đối chiếu 2 mảng kí tự bằng hàm strcmp, quý giá trả về sẽ là một trong 3 trường hợp:

Giá trị trả về là 0:

Điều này còn có nghĩa ngôn từ của hai chuỗi kí từ bỏ này trọn vẹn giống nhau. Ví dụ:

string str1 = "This is a string";string str2 = "This is a string";if(str1.compare(str2) == 0)cout << "str1 & str2 are equal" << endl;elsecout << "str1 ans str2 are not equal" << endl;Giá trị trả về nhỏ hơn 0:

Điều này có nghĩa tại địa điểm phát hiện tại cặp kí tự không tương xứng thân str1 và str2 tạm hotline là vị trí index_not_match, ta có:

str1 < str

Ví dụ:

string str1 = "abcDEF";string str2 = "abcdef";Khi đối chiếu string str1 cùng string str2 như trên bởi dòng lệnh str1.compare(str2), ta nhận giá tốt trị trả về bé dại hơn 0, vì chưng tại vị trí có chỉ số là 3, kí tự "D" của str1 gồm mã ASCII bé dại hơn kí từ bỏ "d" của str2.

Giá trị trả về to hơn 0:

Ngược lại với câu hỏi giá trị trả về nhỏ hơn 0. Mình rước lại lấy một ví dụ trên:

string str1 = "abcDEF";string str2 = "abcdef";Nếu chúng ta thực hiện so sánh như sau:

str2.compare(str1);Giá trị trả về sẽ lớn hơn 0.

Một cách sử dụng khác của cách thức compare:

int compare (size_t pos, size_t len, const string& str) const;

Ví dụ:

string my_string = "Make a comparison";int comparison = my_string.compare(7, 10, "comparison");cout << "Result of the comparison: " << comparison << endl;Đối số pos được bản thân gán quý giá 7, thay mặt cho vị trí bước đầu so sánh. Tại vị trí tất cả chỉ số 7, mình lôi ra 10 kí tự liên tục nhau để lần lượt đối chiếu với chuỗi "comparison" được bản thân truyền vào sinh sống đối số thứ 3 trong cách thức compare.

*

Chương trình phát hiện tại 2 chuỗi kí tự con này kiểu như nhau, đề nghị giá trị trả về là 0.

Tổng kết

Kiểu tài liệu string vào C++ hổ trợ cho bọn họ rất đôi lúc thao tác cùng với chuỗi kí tự. Vày thế, bản thân ưu tiên chuyenly.edu.vn-style string hơn việc sử dụng C-style string.

Hẹn chạm chán lại các bạn trong bài xích học tiếp sau trong khóa đào tạo lập trình C++ hướng thực hành.

Mọi chủ kiến đóng góp hoặc thắc mắc hoàn toàn có thể đặt thắc mắc trực tiếp trên diễn đàn.

www.chuyenly.edu.vn.com

Link Videos khóa học

https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview