Làm việc với chuỗi. Chuỗi lớp. Các nhà xây dựng lớp. Các hàm gán(), nối thêm(), chèn(), thay thế(), xóa(), find(), rfind(), so sánh(), c_str(). Ví dụ. Hàm xử lý chuỗi trong C
Khai báo chuỗi
Chuỗi trong ngôn ngữ C là một mảng các ký tự một chiều, phần tử cuối cùng của nó là ký tự cuối dòng - 0 (một chuỗi được kết thúc bằng 0, nghĩa là một chuỗi kết thúc bằng NULL).
Có thể khai báo một biến kiểu chuỗi trong ngôn ngữ C theo ba cách, hai trong số đó khởi tạo chuỗi tại thời điểm khai báo.
Cách thứ nhất:
Khai báo mảng ký tự (nhớ thêm dấu cách cho null kết thúc):
Char s;
Cách thứ hai:
Gán giá trị ban đầu cho biến chuỗi (trong trường hợp này, trình biên dịch có thể tự tính toán độ dài của chuỗi):
Char s = "Ví dụ khởi tạo chuỗi";
Bên phải dấu gán là một hằng chuỗi. Số 0 ('\0') được tự động thêm vào cuối dòng. Các hằng chuỗi ký tự được đặt trong lớp bộ nhớ tĩnh.
Cách thứ ba:
Dấu hiệu ngầm cho thấy một mảng đang được sử dụng. Bên trái dấu gán là con trỏ tới biểu tượng:
Char *s="Tùy chọn khởi tạo thứ hai";
Biến s sẽ là một con trỏ tới vị trí trong RAM nơi chứa hằng số chuỗi. Một nhược điểm tiềm ẩn trong dạng ký hiệu này là con trỏ tới một ký tự thường được gọi là một chuỗi. Mục bên dưới chỉ là một con trỏ tới một ký tự, vì không có khoảng trống nào được cung cấp cho chuỗi:
Char *s;
Nhập chuỗi từ thiết bị đầu vào tiêu chuẩn (bàn phím)
Có một tập hợp các hàm để làm việc với chuỗi. Đối với đầu vào từ thiết bị đầu vào tiêu chuẩn (bàn phím), các chức năng thư viện từ mô-đun đầu vào/đầu ra tiêu chuẩn thường được sử dụng nhất: quét Và được.
Để nhập một chuỗi bằng hàm quét, sử dụng định dạng « %S» và lưu ý rằng dấu địa chỉ không được sử dụng trước mã định danh dòng « & » , vì mảng một chiều đã được biểu thị bằng một con trỏ về phần đầu của nó:
Scanf("%s",s);
Chức năng được()đọc các ký tự cho đến khi đạt đến ký tự dòng mới. Hàm chấp nhận tất cả các ký tự cho đến ký tự dòng mới, nhưng không bao gồm nó. Số 0 kết thúc ('\0') được thêm vào cuối dòng. Chức năng được()đặt chuỗi ký tự được đọc từ bàn phím vào một tham số kiểu chuỗi và trả về một con trỏ tới chuỗi này (nếu thao tác thành công) hoặc NULL (trong trường hợp có lỗi). Trong ví dụ bên dưới, nếu thao tác hoàn tất thành công, hai dòng giống hệt nhau sẽ được hiển thị trên màn hình:
#bao gồm
Nhân tiện, hãy lưu ý rằng hàm get thường được sử dụng để nhập bất kỳ dữ liệu nào từ bàn phím dưới dạng chuỗi nhằm mục đích chuyển đổi thêm bằng hàm sscanf sang định dạng mong muốn hoặc để phân tích sơ bộ dữ liệu đầu vào, ví dụ:
#bao gồm
In chuỗi ra đầu ra tiêu chuẩn (màn hình giám sát)
Để xuất chuỗi ra thiết bị đầu ra tiêu chuẩn (màn hình điều khiển), bạn có thể sử dụng hai chức năng printf Và đặt. Hàm printf được truyền "%s" làm định dạng. Sự tiện lợi của việc sử dụng chức năng này là ngoài một chuỗi, bạn có thể hiển thị ngay các dữ liệu thuộc loại khác. tính năng tính năng đặt là sau khi in một dòng, nó sẽ tự động chuyển sang dòng tiếp theo.
Các hàm làm việc với chuỗi
Để chuyển đổi chuỗi trong ngôn ngữ C, thư viện chuỗi được cung cấp. Mỗi chức năng có định dạng ghi riêng (nguyên mẫu).
Các chức năng được sử dụng nhiều nhất sẽ được thảo luận trong bài viết này. - đọc
Ví dụ về các chương trình (danh sách) làm việc với chuỗi
Trong bài học này chúng ta sẽ thảo luận về các chuỗi kiểu C; có thể bạn đã thấy những chuỗi này trên trang web của chúng tôi hoặc trong bất kỳ sách giáo khoa nào khác. Trên thực tế, chuỗi C chỉ là các mảng ký tự nhưng có đặc điểm riêng nên chúng ta luôn biết đâu là cuối dòng. Trong bài viết này, chúng ta sẽ xem xét một số hàm để làm việc với chuỗi, ví dụ: bạn - sao chép, nối, lấy độ dài của chuỗi.
Dây là gì?
Lưu ý rằng cùng với các chuỗi kiểu C, về cơ bản là các mảng đơn giản, cũng có các chuỗi ký tự, chẳng hạn như "chữ" này. Trong thực tế, cả chuỗi và chữ chỉ đơn giản là các tập hợp ký tự nằm cạnh nhau trong bộ nhớ máy tính. Nhưng vẫn có sự khác biệt giữa mảng và chữ: chữ không thể thay đổi được và chuỗi thì có thể.
Bất kỳ hàm nào lấy chuỗi kiểu C cũng có thể lấy chuỗi ký tự làm tham số. Ngoài ra còn có một số thực thể trong C có thể trông giống như các chuỗi trong khi thực tế thì không phải vậy. Bây giờ tôi đang nói về các ký tự, chúng được đặt trong dấu ngoặc đơn, đây là một ví dụ - "a", như bạn có thể thấy, đây không phải là một chuỗi. Tại một vị trí cụ thể, một ký tự có thể được gán cho một chuỗi nhưng các ký tự không thể được xử lý dưới dạng chuỗi. Nếu bạn còn nhớ, mảng hoạt động giống như con trỏ, vì vậy nếu bạn truyền một ký tự đơn vào một chuỗi thì sẽ bị coi là lỗi.
Từ những điều trên, bạn hẳn đã nhận ra rằng chuỗi là mảng ký tự và chuỗi ký tự là các từ được bao quanh bởi dấu ngoặc kép. Đây là một ví dụ khác về nghĩa đen:
"Đây là một chuỗi tĩnh"
Bạn đã quên tính đặc hiệu của chuỗi, được đề cập cao hơn một chút? Vì vậy, chuỗi C phải luôn kết thúc bằng ký tự null, nghĩa đen là “\0”. Vì vậy, để khai báo một chuỗi gồm 49 chữ cái, bạn cần dành thêm một ô cho ký tự null:
Char myString;
Như bạn có thể thấy từ ví dụ, độ dài của mảng là 50 ký tự, 49 trong số đó sẽ là một dòng và một, ký tự cuối cùng sẽ là ký tự null. Điều quan trọng cần nhớ là phải luôn có ký tự rỗng ở cuối dòng C, giống như có dấu chấm ở cuối mỗi câu. Mặc dù ký tự null không được hiển thị khi chuỗi được xuất ra nhưng nó vẫn chiếm dung lượng trong bộ nhớ. Vì vậy, về mặt kỹ thuật, trong một mảng gồm 50 phần tử, bạn chỉ có thể lưu trữ 49 chữ cái vì cần có ký tự cuối cùng để kết thúc chuỗi. Ngoài ra, con trỏ cũng có thể được sử dụng như một chuỗi. Nếu bạn đọc bài viết về , bạn có thể làm điều gì đó như thế này:
Char *myString; // con trỏ kiểu char myString = malloc(sizeof(*myString) * 64); // cấp phát bộ nhớ
Trong ví dụ này, chúng tôi đã phân bổ 64 vị trí bộ nhớ cho mảng myString. Để giải phóng bộ nhớ, hãy sử dụng hàm free().
Miễn phí(myString);
Sử dụng chuỗi
Chuỗi rất hữu ích khi bạn cần thực hiện nhiều thao tác khác nhau trên thông tin văn bản. Ví dụ: nếu bạn muốn người dùng nhập tên vào chương trình, bạn sẽ sử dụng một chuỗi. Sử dụng scanf() để nhập chuỗi có tác dụng nhưng có thể dẫn đến tràn bộ đệm. Rốt cuộc, chuỗi đầu vào có thể lớn hơn kích thước của chuỗi đệm. Có một số cách để giải quyết vấn đề này, nhưng cách đơn giản nhất là sử dụng , được khai báo trong tệp tiêu đề
Khi đọc đầu vào từ người dùng, nó sẽ đọc tất cả các ký tự ngoại trừ ký tự cuối cùng. Sau đó, dấu kết thúc số 0 sẽ được đặt ở cuối dòng đọc. Hàm fgets() sẽ đọc các ký tự cho đến khi người dùng nhấn Enter. Hãy xem một ví dụ về việc sử dụng fgets():
#bao gồm
Tham số đầu tiên của fgets() là một chuỗi, tham số thứ hai là kích thước của chuỗi và tham số thứ ba là một con trỏ tới luồng dữ liệu đầu vào.
Kết quả của chương trình:
<ВВОД>...
Như bạn có thể thấy, từ đầu ra của chương trình, một ký tự dòng mới - "\n" - đã được nhập vào dòng đầu vào. Điều này xảy ra vì fgets() đếm nút Enter được nhấn vào chuỗi myString và hoàn thành công việc của nó. Điều này có nghĩa là bạn có thể cần phải xóa ký tự dòng mới theo cách thủ công. Một cách để làm điều này là liệt kê từng ký tự. Hãy sửa đổi chương trình và xóa ký tự dòng mới:
#bao gồm
Xin lưu ý rằng nếu chuỗi đầu vào chứa ít hơn 100 ký tự thì ký tự dòng mới cũng sẽ được đưa vào chuỗi. Do đó, chúng ta có thể loại bỏ ký tự này bằng cách sử dụng vũ lực đơn giản. Chúng tôi đã thêm một vòng lặp vào chương trình để lặp qua các ký tự của chuỗi, dòng 12-19. Và khi chúng ta gặp một ký tự dòng mới, chúng ta thay thế nó bằng một ký tự null, dòng 16. Kết quả của chương trình:
Nhập một dòng dài: Định mệnh để lại dấu ấn Bạn đã nhập dòng sau: Định mệnh để lại dấu ấn Để đóng cửa sổ này, bấm vào<ВВОД>...
Đó là tất cả cho bây giờ. Trong bài viết tiếp theo tôi sẽ cho bạn biết về các hàm đặc biệt để làm việc với chuỗi.
P.S.: Tất cả chúng ta đều thích xem các bản ghi video khác nhau, nhưng đôi khi không phải lúc nào cũng có thể phát một số định dạng tệp video. Vì vậy, bạn có thể giải quyết vấn đề này bằng chương trình - Xilisoft Converter Ultimate. Bạn có thể dễ dàng nhanh chóng chuyển đổi video từ định dạng này sang định dạng khác. Ngoài ra, chương trình này còn có thể chuyển đổi các tập tin âm thanh và hình ảnh động.
Tiêu chuẩn C++ hiện đại định nghĩa một lớp có các hàm và thuộc tính (biến) để tổ chức công việc với các chuỗi (trong ngôn ngữ C cổ điển không có chuỗi nào như vậy, chỉ có các mảng ký tự char):
#bao gồm
#bao gồm#bao gồm
Để làm việc với chuỗi, bạn cũng cần kết nối một không gian tên tiêu chuẩn:
Sử dụng không gian tên std;
Nếu không, bạn sẽ phải chỉ định bộ mô tả lớp std::string ở mọi nơi thay vì string .
Dưới đây là ví dụ về chương trình làm việc với chuỗi (không hoạt động trong các trình biên dịch tương thích với C cũ hơn!):
#bao gồm
Các tính năng chính mà lớp chuỗi có:
- khởi tạo bằng một mảng ký tự (kiểu chuỗi tích hợp) hoặc một đối tượng khác thuộc kiểu string . Loại tích hợp không có khả năng thứ hai;
- sao chép dòng này sang dòng khác. Đối với loại tích hợp sẵn, bạn phải sử dụng hàm strcpy();
- truy cập vào các ký tự riêng lẻ của một chuỗi để đọc và viết. Trong một mảng tích hợp, việc này được thực hiện bằng cách sử dụng thao tác chỉ mục hoặc đánh địa chỉ gián tiếp bằng con trỏ;
- so sánh hai chuỗi về sự bằng nhau. Đối với loại tích hợp sẵn, các hàm của họ strcmp() được sử dụng;
- nối (nối) hai chuỗi, tạo ra kết quả dưới dạng chuỗi thứ ba hoặc thay vì một trong các chuỗi ban đầu. Đối với loại tích hợp, hàm strcat() được sử dụng, nhưng để có kết quả ở một dòng mới, bạn cần sử dụng tuần tự các hàm strcpy() và strcat(), đồng thời cũng quan tâm đến việc cấp phát bộ nhớ;
- phương tiện tích hợp sẵn để xác định độ dài của một chuỗi (các hàm thành viên lớp size() và l ength()). Cách duy nhất để tìm ra độ dài của một chuỗi kiểu dựng sẵn là tính toán nó bằng hàm strlen();
- khả năng tìm hiểu xem một chuỗi có trống không.
Chúng ta hãy xem xét các tính năng cơ bản này chi tiết hơn.
Đang khởi tạo chuỗi khi miêu tả và chiều dài chuỗi(không bao gồm dấu kết thúc null):
Chuỗi st("Chuỗi của tôi\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
Chuỗi cũng có thể trống:
Chuỗi st2;
Để kiểm tra điều đó dòng này có trống không, bạn có thể so sánh độ dài của nó với 0:
Nếu (! st.size()) // trống
hoặc sử dụng phương thức void(), phương thức này trả về true cho một chuỗi trống và false cho một chuỗi không trống:
Nếu (st.empty()) // trống
Hình thức tạo chuỗi thứ ba khởi tạo một đối tượng kiểu chuỗi với một đối tượng khác cùng loại:
Chuỗi st3(st);
Chuỗi st3 được khởi tạo bằng chuỗi st . Làm thế nào chúng ta có thể đảm bảo những điều này các dòng phù hợp? Hãy sử dụng toán tử so sánh (==):
Nếu (st == st3) // quá trình khởi tạo thành công
Làm sao sao chép dòng này sang dòng khác? Sử dụng toán tử gán bình thường:
St2 = st3; // sao chép st3 sang st2
Vì nối chuỗi toán tử cộng (+) hoặc toán tử gán cộng (+=) được sử dụng. Cho hai dòng:
Chuỗi s1("xin chào, "); chuỗi s2("thế giới\n");
Chúng ta có thể nhận được chuỗi thứ ba bao gồm sự nối của hai chuỗi đầu tiên, theo cách này:
Chuỗi s3 = s1 + s2;
Nếu chúng ta muốn thêm s2 vào cuối s1, chúng ta nên viết:
S1 += s2;
Hoạt động bổ sung có thể nối các đối tượng lớp sợi dây không chỉ giữa chúng mà còn với các chuỗi kiểu tích hợp sẵn. Bạn có thể viết lại ví dụ trên để các ký tự đặc biệt và dấu chấm câu được biểu thị bằng kiểu char * có sẵn và các từ quan trọng được biểu thị bằng các đối tượng của chuỗi lớp:
Const char *pc = ", "; chuỗi s1("xin chào"); chuỗi s2("thế giới"); chuỗi s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;
Các biểu thức như vậy hoạt động vì trình biên dịch "biết" cách tự động chuyển đổi các đối tượng thuộc loại có sẵn thành các đối tượng của lớp chuỗi. Cũng có thể chỉ cần gán một chuỗi dựng sẵn cho một đối tượng chuỗi:
Chuỗi s1; const char *pc = "một mảng ký tự"; s1 = máy tính; // Phải
Phép biến đổi ngược trong trường hợp này không hoạt động. Cố gắng thực hiện khởi tạo chuỗi kiểu tích hợp sau đây sẽ gây ra lỗi biên dịch:
Char *str = s1; // dịch lỗi
Để thực hiện chuyển đổi này, bạn phải gọi rõ ràng một hàm thành viên có tên là c_str() ("chuỗi C"):
Const char *str = s1.c_str();
Hàm c_str() trả về một con trỏ tới một mảng ký tự chứa chuỗi của đối tượng chuỗi giống như nó xuất hiện trong kiểu chuỗi dựng sẵn. Từ khóa const ở đây ngăn chặn khả năng "nguy hiểm" trong môi trường trực quan hiện đại khi sửa đổi trực tiếp nội dung của một đối tượng thông qua một con trỏ.
ĐẾN nhân vật riêng lẻ một đối tượng thuộc loại string , giống như loại có sẵn, có thể được truy cập bằng thao tác chỉ mục. Ví dụ: đây là đoạn mã thay thế tất cả các dấu chấm bằng dấu gạch dưới:
Chuỗi str("www.disney.com"); kích thước int = str.size(); vì (int i = 0; tôi< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Thay thế(str.begin(), str.end(), ".", "_");
Đúng, nó không phải là phương thức thay thế của lớp chuỗi được sử dụng ở đây mà là thuật toán cùng tên:
#bao gồm
Bởi vì đối tượng chuỗi hoạt động giống như một thùng chứa nên các thuật toán khác có thể được áp dụng cho nó. Điều này cho phép bạn giải quyết các vấn đề không được giải quyết trực tiếp bằng các hàm của lớp chuỗi.
Dưới đây là mô tả ngắn gọn về các toán tử và chức năng chính của lớp chuỗi; các liên kết trong bảng dẫn đến các mô tả bằng tiếng Nga trên Internet. Ví dụ, có thể tìm thấy danh sách đầy đủ hơn về các khả năng của lớp chuỗi trên Wikipedia hoặc trên trang web cplusplus.com.
Chỉ định các ký tự trong một chuỗi |
|
toán tử= |
gán giá trị cho một chuỗi |
giao phó |
gán các ký tự cho một chuỗi |
Truy cập vào các ký tự riêng lẻ |
|
Tại |
lấy ký tự được chỉ định và kiểm tra xem chỉ mục có nằm ngoài giới hạn không |
nhà điều hành |
lấy ký tự được chỉ định |
đằng trước |
lấy ký tự đầu tiên |
mặt sau |
lấy ký tự cuối cùng |
dữ liệu |
trả về một con trỏ tới ký tự đầu tiên của chuỗi |
c_str |
trả lại không thể sửa đổi một mảng ký tự C chứa các ký tự của chuỗi |
Kiểm tra công suất đường dây |
|
trống |
kiểm tra xem một chuỗi có trống không |
kích cỡ |
trả về số ký tự trong một chuỗi |
kích thước tối đa |
trả về số ký tự tối đa |
dự trữ |
dự trữ không gian lưu trữ |
Hoạt động chuỗi |
|
thông thoáng |
xóa nội dung của một chuỗi |
chèn |
chèn ký tự |
tẩy xóa |
xóa ký tự |
đẩy lùi |
thêm một ký tự vào cuối chuỗi |
bật lại |
xóa ký tự cuối cùng |
nối thêm |
|
toán tử+= |
nối các ký tự vào cuối chuỗi |
so sánh |
so sánh hai chuỗi |
thay thế |
thay thế mọi lần xuất hiện của ký tự được chỉ định |
chất nền |
trả về một chuỗi con |
sao chép |
sao chép ký tự |
thay đổi kích thước |
thay đổi số lượng ký tự được lưu trữ |
p»їCơ quan SEO đáng tin cậy Ấn Độ có thể tăng doanh thu của các doanh nghiệp nhỏ 80% người dùng tìm kiếm trên Google và các công cụ tìm kiếm khác trước khi mua hàng và hơn 50% yêu cầu được tạo thông qua công cụ tìm kiếm sẽ được chuyển đổi. Hai số liệu thống kê này chứng minh tầm quan trọng của Tối ưu hóa Công cụ Tìm kiếm. Có rất nhiều số liệu thống kê và sự kiện cho thấy rõ quan điểm: bất kỳ doanh nghiệp quy mô nhỏ, vừa hoặc lớn nào cũng cần dịch vụ SEO chuyên nghiệp. Các doanh nghiệp nhỏ và các công ty khởi nghiệp thường gặp phải vấn đề về ngân sách. Họ có thể nhờ sự trợ giúp của bất kỳ cơ quan SEO đáng tin cậy nào từ Ấn Độ để có được dịch vụ SEO tốt nhất trong ngân sách của họ nhằm tăng doanh thu. khảo sát từ người lưu vong
|