Xin chào, và chào mừng trở lại. Trong bài giảng
này, tôi muốn nói về cách tạo một chuỗi, cụ thể là
cách bạn có thể thực hiện trong c bằng cách sử dụng một mảng ký tự.
Tôi có xu hướng sử dụng chuỗi thuật ngữ và chuỗi ký tự thay thế cho nhau.
Nhưng thực sự một chuỗi ký tự là mảng char mà chúng ta sẽ nói đến.
Đó là một khái niệm rất quan trọng.
Giờ đây, chúng ta sẽ có thể sử dụng các từ và văn bản trong chương trình của mình để làm mọi việc.
Bây giờ bản thân c không có bất kỳ kiểu dữ liệu nào đại diện cho một chuỗi.
Không có cái gì ở đó. Nhiều ngôn ngữ hỗ trợ
một đối tượng hoặc một kiểu dữ liệu kiểu chuỗi.
Bây giờ vì không có kiểu dữ liệu c trong chuỗi, bạn không thể
sử dụng bất kỳ toán tử nào trên chuỗi.
Vì vậy, những gì chúng ta sẽ làm cuối cùng là chúng ta sẽ sử dụng thư viện chuẩn và có tất
cả các loại hàm chuỗi mà chúng ta sẽ nói đến.
Chúng tôi có ba bài giảng dành riêng cho các hàm chuỗi khác nhau mà bạn có thể sử dụng.
Và điều này sẽ giúp chúng ta thao tác trên chuỗi, lấy thông tin về chuỗi.
Nhưng bạn không thể sử dụng các toán tử trên chuỗi, không có chuỗi làm tăng
hoặc giảm thiểu, không có gì giống như vậy.
Các chuỗi trong c được lưu trữ trong một mảng kiểu char.
Chúng tôi biết mảng là gì. Chúng tôi biết kiểu char là gì.
Kiểu char là một ký tự đơn, một mảng bạn có thể chỉ
lưu nhiều phần tử trong cùng một tên.
Vì vậy, có nghĩa là một chuỗi sẽ nằm bên trong một mảng ký
tự vì một chuỗi có nhiều ký tự.
Vì vậy, các ký tự của một chuỗi được lưu trữ trong các ô nhớ liền kề, mỗi ô một ký tự.
Bạn có thể truy cập nó giống như bạn cũng truy cập một mảng.
Nhưng thực tế bạn sẽ khai báo một chuỗi như thế nào và thấy rằng bạn sẽ chỉ sử dụng kiểu
char và sau đó là dấu ngoặc để biểu thị kích thước, giống như một mảng bình
thường nếu bạn tạo nó ở một kiểu khác.
Char và sau đó là bất kỳ tên nào của bạn và sau đó là kích thước
của mảng ký tự bên trong dấu ngoặc vuông.
Đó là cách bạn có thể khai báo một chuỗi trong c.
Bây giờ khi bạn khai báo chuỗi trong c như thế này, không có
dữ liệu thực tế nào được liên kết với. Bạn chỉ xác định kích thước.
Đó là cách đơn giản nhất.
Vì vậy, biến có thể chứa một chuỗi chứa tối đa 19 ký tự.
Hãy nhớ ký tự null này.
Nếu bạn nói rằng kích thước chuỗi của bạn sẽ là 20, điều đó có nghĩa là chỉ có
19 ký tự thực sự có thể được lưu
trữ vì bạn phải có thêm một ký tự cho giá trị rỗng.
Hãy ghi nhớ rằng, khai báo một mảng ký tự là 20 có nghĩa là 19
ký tự có thể được lưu trữ ở đó.
Khi bạn chỉ định thứ nguyên của một mảng mà bạn định sử dụng trước một chuỗi -
để lưu trữ một
chuỗi, nó phải lớn hơn ít nhất một ký tự trong chuỗi mà bạn muốn lưu trữ.
Trình biên dịch sẽ tự động thêm dấu chấm hết null vào cuối mỗi hằng chuỗi.
Vì vậy, những gì bạn thực sự nên làm là khi bạn
tạo các chuỗi ký tự này, bạn nên khởi tạo chúng.
Vì vậy, bạn có thể khởi tạo một biến chuỗi giống như bạn có thể khởi tạo một mảng.
Bạn đặt từng ký tự bên trong các dấu ngoặc này.
Vì vậy, điều này trông rất giống với nếu bạn khởi tạo các phần tử trong một mảng số nguyên.
Nhưng nếu bạn nói từ char và sau đó bên
trong dấu ngoặc vuông, bạn đặt từng ký tự đơn lẻ sẽ
tạo ra một mảng ký tự.
Vì vậy, nó giống như bất kỳ khởi tạo mảng nào khác.
Trong trường hợp không đặt kích thước, trình biên
dịch c sẽ tự động tính số phần tử trong mảng và sau đó thêm một phần tử vào phần tử null.
Vì vậy, nó dựa trên số lượng bộ khởi tạo bạn có giữa các dấu ngoặc
nhọn, dấu ngoặc nhọn.
Câu lệnh này sẽ dành không gian và bộ nhớ cho chính xác bảy
ký tự, dấu chấm than h-e-l-l-o và
sau đó là dấu chấm hết rỗng, và sơ đồ nhỏ bên phải này cho bạn thấy điều đó.
Tự động và thêm dấu chấm hết rỗng đó. Bây giờ sẽ thực sự
là một nỗi đau nếu bạn luôn phải khởi tạo
các mảng ký tự của mình bằng các dấu ngoặc kép sau dấu phẩy.
Vì vậy, những gì bạn có thể làm là ngay cả ký hiệu viết tắt là bạn có thể chỉ cần đặt dấu ngoặc kép xung quanh đó.
Vì vậy, bạn có thể chỉ định chuỗi một cách rõ ràng, như trong ví dụ đầu tiên
đó, và sau đó bạn sẽ phải thực sự sử dụng một hàm chuỗi
chỉ để áp dụng dữ liệu cho
nó hoặc bạn có thể để trình biên dịch làm việc đó cho bạn.
Vấn đề với việc thực hiện nó một cách rõ ràng là bạn luôn phải nhớ thêm ký tự phụ đó
cho giá trị null.
Vì vậy, những gì bạn thực sự nên làm là bạn nên để trình biên dịch tìm ra nó cho bạn.
Vì vậy, không đặt bất kỳ số nào bên trong các dấu ngoặc đó cho kích thước.
Bởi vì nếu kích thước được chỉ định quá nhỏ, trình biên dịch không thể phù hợp với
ký tự null kết thúc ở cuối mảng và nó không đặt một ký tự ở đó và nó sẽ không
cho bạn biết rằng nó đã không đặt một ký tự ở đó.
Vì vậy, bạn sẽ có một lỗi trong chương trình của bạn mà bạn thậm chí sẽ không biết nó.
Thực tiễn tốt nhất là khi bạn đang sử dụng một ký tự chuỗi
và bạn đang khởi tạo một chuỗi để chỉ cho phép trình biên dịch tìm ra kích thước cho bạn.
Làm cho nó có kích thước lớn hơn hoặc thứ gì đó và sau đó chỉ cần đặt nó vào đó và nó sẽ tìm ra kích thước cho bạn.
Vì vậy, không chỉ định kích thước. Hãy để trình biên dịch tìm ra nó.
Bằng cách này, bạn có thể chắc chắn rằng nó sẽ đúng.
Chỉ cần để các dấu ngoặc đó dưới dạng dấu ngoặc
trống và gán nó bằng toán tử gán và sau đó bên trong dấu
ngoặc kép bạn có thể đặt nó. Bạn thậm chí không cần dấu ngoặc vuông.
Đây là cách thực hành tốt nhất. Chúng tôi sẽ đi qua một ví dụ.
Bạn cũng có thể khởi tạo chỉ một phần
của mảng các phần tử kiểu char với một chuỗi.
Vì vậy, nếu bạn thực sự tạo ra một kích thước thực sự lớn và
bạn chỉ chỉ định một vài ký tự, điều đó cũng tốt,
bạn chỉ đang khởi tạo một số ký tự. Tất cả các ký tự khác
sẽ trống rỗng.
Vì vậy, những gì sẽ xảy ra ở đây là trình biên dịch sẽ khởi tạo năm phần tử đầu tiên.
Str 0 đến str thứ 4, tất cả các
ký tự đó của chuỗi hằng số và sau đó là chuỗi con 5
sẽ chứa ký tự null.
Khoảng trống vẫn sẽ được phân bổ cho tất cả 40 phần tử
trong mảng nhưng chỉ năm phần tử trong số đó sẽ được sử dụng, bốn phần tử cộng với ký tự null.
Vì vậy, một lần nữa, phương pháp hay nhất của bạn không thực sự chỉ định một số bên trong kích
thước, chỉ cần gán cho nó một chuỗi ký tự bằng cách sử dụng dấu ngoặc kép.
Đó là những gì bạn sẽ thấy.
Bây giờ nếu bạn không khởi tạo và bạn chỉ tạo mảng
ký tự với kích thước, làm thế nào để bạn đặt ngày vào đó.
Vì đó là mảng nên bạn không thể chỉ định dữ liệu.
Chúng ta biết rằng nếu chúng ta có một mảng số nguyên, chúng ta
không thể chỉ định một mảng số nguyên là số năm,
điều đó không có ý nghĩa. Bạn phải xác định các yếu tố thực tế.
Bạn phải xác định các chỉ số.
Vì vậy, bạn không thể làm điều gì đó như khai báo một mảng ký tự với 100 ký tự và
sau đó nói s bằng hello. Điều đó sẽ không hiệu quả.
Bởi vì, một lần nữa, s là một mảng. Mặc dù đó là một chuỗi bên trong dấu ngoặc kép, nó vẫn là một mảng trong bộ nhớ.
Vì vậy, nếu bạn đang thực hiện một thao tác gán, bạn không thể
gán một mảng ký tự cho một mảng ký tự khác như trên.
Nếu bạn muốn gán dữ liệu cho một mảng
ký tự sau khi đã khai báo và sau khi khởi tạo xong, bạn phải
sử dụng một hàm đặc biệt có tên là str copy.
Và chúng ta sẽ nói về điều đó trong một bài giảng khác.
Vì vậy, cho đến thời điểm này, khi bạn tạo chuỗi của mình, chúng sẽ ở dạng chuỗi ký tự,
chúng sẽ nằm trong dấu ngoặc kép và bạn sẽ không bao giờ sửa đổi chúng.
Vì vậy, điều này cũng hoàn toàn hợp lệ. Bạn thực sự có thể chỉ cần truy cập
các ký tự này hoặc từng phần tử trong mảng bằng chỉ mục và chỉ định từng ký tự.
Vì vậy, s sub 0, s sub 1 và sau đó đặt một ký tự duy nhất vào dấu nháy đơn.
Bạn có thể chỉ định nó theo cách đó. Nhưng hãy tưởng tượng nếu bạn có một chuỗi 100 byte.
Điều này sẽ mất rất nhiều dòng mã. Vì vậy, bạn không muốn làm điều đó.
Những gì bạn sẽ làm là khởi tạo nó khi bạn khai báo nó
không có kích thước và sau đó chỉ định xem bạn có bao
giờ muốn sửa đổi nó hay không mà bạn str copy.
Đối với việc hiển thị một chuỗi dưới dạng đầu ra, chúng ta vẫn sẽ sử dụng hàm printf đó.
Khi bạn muốn tham chiếu đến một chuỗi ở bất kỳ đâu trong chương trình của mình, bạn chỉ cần
sử dụng tên mảng của chính nó.
Bạn không cần phải chỉ định các chỉ số.
Bởi vì các chỉ số bên trong mảng sẽ chỉ định một ký tự duy nhất.
Nếu bạn muốn toàn bộ chuỗi, bạn chỉ cần sử dụng tên mảng.
Vì vậy, nếu bạn đang sử dụng hàm printf để hiển thị đầu
ra, bạn chỉ cần làm như sau. Bên trong dấu ngoặc kép, bạn
sẽ sử dụng phần trăm s làm định dạng định dạng và sau đó chỉ là tên của mảng ký tự.
Vì vậy, bạn không đối xử với nó như các mảng khác khi bạn muốn truy cập nó. Khi bạn muốn truy cập nó chỉ có tên mà không
có chỉ mục hoặc dấu ngoặc vuông thực sự.
Và phần trăm dưới dạng định dạng chỉ định là để xuất
ra một chuỗi kết thúc bằng rỗng. Hãy nhớ rằng trước khi chúng ta sử dụng phần trăm d
cho số nguyên, bạn có thể sử dụng phần trăm c cho các ký tự.
Đối với chuỗi, bạn sử dụng phần trăm s và đó là các mảng ký tự.
Nó mong đợi một số chuỗi kết thúc null.
Vì vậy, tuy nhiên, bạn khởi tạo chuỗi nếu bạn đã thực hiện nó với kích thước không có và dấu chấm dứt
null sẽ tự động được thêm vào hoặc nếu bạn
đã tạo nó với một kích thước cụ thể và bạn đã thêm nó hoặc nếu bạn đã thêm nó
một cách rõ ràng, điều đó không quan trọng. Nó chỉ phải được chấm dứt bằng rỗng.
Hàm printf giả sử một trong những trường hợp gặp phải mã định dạng phần trăm
s mà đối số tương ứng là một chuỗi ký tự được kết thúc bằng một ký tự rỗng.
Đó là những gì nó mong đợi, vì vậy nó phải như vậy.
Để nhập một chuỗi, chúng ta biết cách nhập các
bộ dữ liệu khác qua bàn phím bằng cách sử dụng scanf.
Chúng ta sẽ làm điều tương tự đối với việc nhập chuỗi.
Chúng ta sẽ sử dụng một hàm scanf. Với hàm scanf, nó sẽ giống
như vậy ngoại trừ việc bạn sẽ sử dụng một định dạng định dạng khác.
Vì vậy, đối với chuỗi, bạn sẽ sử dụng phần trăm s làm đầu vào.
Và nó được sử dụng để nhập một chuỗi.
Điều khác cần chú ý ở đây là không có ký hiệu và cho tên biến
vì nó là một ký tự. Hãy nhớ rằng, chúng tôi đã đề cập rằng bạn
chỉ phải cung cấp ký hiệu và địa chỉ của toán tử trên chuỗi.
Lý do là khi chúng ta nói về các con trỏ, nó sẽ rõ ràng hơn.
Nhưng đầu vào char mặc dù đó là một mảng ký
tự nhưng nó là một con trỏ và scanf khi đối số thứ hai của nó nhận một con trỏ.
Và đó là lý do tại sao bạn không cần phải làm điều đó. Khi bạn khai báo số nguyên và số đôi, chúng không phải
là con trỏ và. Vì vậy, nếu
bạn muốn đọc đầu vào từ bàn phím bằng cách sử dụng scanf, đối số thứ hai yêu cầu một con
trỏ mà bạn phải chuyển vào một địa chỉ.
Bây giờ với scanf khi bạn thực hiện một
chuỗi, scanf sẽ chỉ đọc cho đến khi có khoảng trống.
Vì vậy, nếu bạn thực hiện scanf và bạn gõ Jason
là một người hướng dẫn.
Thứ duy nhất sẽ được lưu trữ trong đầu vào là Jason. Bởi vì một khi nó chạm vào
khoảng trống đó, nó sẽ không đọc phần còn lại của chuỗi.
Vì vậy, có những hàm khác mà bạn có thể sử dụng để đọc toàn bộ chuỗi.
Một số ví dụ mà chúng tôi sẽ sử dụng có thể sẽ làm được điều đó. Bạn có thể làm những việc như f get
s, đây là một cách khác để đọc dữ liệu nhập từ bàn phím và điều đó sẽ đọc
toàn bộ chuỗi bất kể khoảng trắng.
Nhưng có một cái khác mà tôi nghĩ nó được
gọi là get underscore s cho C11,
nhưng chúng ta sẽ nói về điều đó nhiều hơn, nhưng đó chỉ là
một điều cần nhớ khi bạn đọc đầu vào cho chuỗi. Nó sẽ chỉ đọc đến hết khoảng trống.
Làm thế nào về việc kiểm tra nếu hai chuỗi bằng nhau.
Chà, cho đến thời điểm này, chúng tôi đã kiểm tra tất cả
các biến để xem chúng có bằng nhau hay không, chúng tôi chỉ sử dụng các biến bằng bằng.
Nhưng với chuỗi, điều này sẽ không hoạt động.
Toán tử bình đẳng, hãy nhớ, chúng tôi đã nói rằng chuỗi là mảng ký tự, vì vậy bạn không thể sử dụng toán tử trên chúng.
Và toán tử bình đẳng chỉ có thể được áp dụng cho ints và double
hoặc float hoặc các ký tự.
Nó không hoạt động trên cấu trúc hoặc mảng. Bạn không thể so sánh hai mảng.
Vì vậy, nó sẽ không hoạt động với chuỗi. Nếu bạn muốn xác định xem hai chuỗi có
bằng nhau hay không, bạn phải so sánh rõ ràng hai chuỗi ký tự từng ký tự.
Vì vậy, bạn phải xem xét từng phần tử trong chỉ
mục mảng theo chỉ mục.
Tuy nhiên, đó thực sự là một vấn đề lớn vì điều đó sẽ thực sự tẻ nhạt.
Vì vậy, chúng ta sẽ nói về cách bạn có thể làm điều đó
rất dễ dàng bằng cách sử dụng một hàm so sánh str từ thư viện chuẩn, nhưng
bạn không thể sử dụng các dấu bằng = hãy nhớ điều đó.
Và một lần nữa, xin nhắc lại, tôi đã nói vài lần rồi tôi muốn nói lại
lần nữa, chuỗi hằng số x bên trong dấu
ngoặc kép không giống với hằng số ký tự x bên trong dấu ngoặc kép.
X bên trong dấu ngoặc kép là kiểu cơ bản, nó chỉ là ký tự hoặc
dấu nháy đơn.
X bên trong dấu ngoặc kép là một kiểu ổ đĩa, đó là một mảng kiểu char.
X bên trong dấu ngoặc kép thực sự bao gồm hai ký tự, x và
dấu chấm dứt rỗng, ký tự null, vì vậy hãy ghi nhớ điều đó.
Đây là một ví
dụ về cách chúng ta có thể tạo chuỗi khai
báo chúng với một kích thước hoặc khởi tạo chúng trên cùng một dòng.
Bây giờ đây là thực hành tốt nhất. Nếu bạn định sử dụng chuỗi ký tự, điều
tôi sẽ làm là tôi sẽ
làm những gì nó nói ngay tại đây, tạo mảng ký tự, không chỉ định
kích thước và sau đó ở bên phải của toán tử gán có dấu ngoặc kép.
Trình biên dịch sẽ tự động tạo chuỗi bên phải và thêm ký tự kết thúc null vào chuỗi đó.
Nếu bạn chỉ định kích thước và sau đó bạn không có đủ ký tự, nó sẽ không lưu trữ nó.
Vì vậy, chỉ cần tạo các ký tự chuỗi ký tự
bằng cách sử dụng kiểu dữ liệu char,
tên của biến và sau đó là dấu ngoặc trống.
Chương trình này tôi nghĩ sẽ đếm các ký tự trong một
mảng, vì vậy về cơ bản nó sẽ lấy độ dài của chuỗi.
Những gì chúng tôi đang làm ở đây là chúng tôi đang tạo một biến có tên là count trong hai
mảng ký tự với hai chuỗi khác nhau, là có hay không và sau
đó là dấu phẩy, đó là câu hỏi.
Char str một sẽ có một máy phát điện sau b, và str
sẽ có một thay thế sau câu hỏi.
Vì vậy, chúng ta có một vòng lặp ở đây sẽ đi qua
mảng đầu tiên, từ số đếm bằng 0 cho đến khi chúng ta thấy một dấu chấm hết rỗng.
Và chúng ta có thể sử dụng not bằng trong trường hợp này vì chúng ta đang so sánh một ký tự.
Null terminator dưới dạng một ký tự. Nó hoàn toàn tốt để so sánh các ký tự.
Vì vậy, vòng lặp while của chúng ta sẽ hoạt động cho đến khi chúng ta nhìn thấy một dấu chấm hết null.
Khi chúng ta thấy một dấu chấm hết rỗng, chúng ta sẽ nhảy ra ngoài.
Số lượng sẽ bằng số ký tự trong chuỗi đó.
Vì vậy, nó là độ dài của chuỗi đó.
Chúng tôi làm điều đó cho cả hai chuỗi. Và bạn sẽ nhận thấy rằng về cơ bản
cả hai chuỗi sẽ có độ dài chính xác bởi vì chúng ta chỉ xem qua từng chuỗi.
Đối với b hoặc không đối với b sẽ là một cái gì đó giống
như 18 ký tự.
Bây giờ bạn sẽ không bao giờ thực sự cần phải làm bất cứ điều gì như
thế này bởi vì chúng tôi có một hàm trợ giúp tuyệt vời với chiều dài str để tìm độ dài của chuỗi.
Nhưng một lần nữa, những gì điều này đang chứng minh thực tế là nó là một mảng.
Và nếu bạn muốn so sánh hoặc tìm độ dài của một chuỗi, bạn có thể
sử dụng not = và nhìn vào ký tự, dấu chấm dứt null.
Tôi hy vọng nó sẽ có ích. Đây là cách chúng ta sẽ xác định và khởi tạo các ký tự chuỗi.
Cảm ơn bạn.