Thứ Sáu, 26 tháng 4, 2013

Character Sequences

Như đã biết, Thư viện chuẩn C++ implements một lớp string , những gì hữu dụng cho ta khi handle và thao tác chuỗi các kí tự. Tuy nhiên bởi vì strings thực chất là thứ tự của các kí tự, chúng ta có thể biểu diễn chúng như một mảng với thành phần là các kí tự.

Cho ví dụ mảng sau:

 
char jenny [20];

la một mảng có thể lưu trữ đến 20 kí tự kiểu char. Nó có thể được biểu diến bằng 20 ô vuông liền kề nhau, mỗi ô vuông đại diện cho một kí tự. 

Theo đó, trong mảng này, chúng ta có thể lưu sequences of charcters với độ dài lên tới 20 kí tự. nhưng chúng ta cũng có thể lưu sequences ngắn hơn. Ví dụ jenny có thể lưu một vài điểm trong chương trình hoặc là sequence "hello" hoặc là sequence "Merry Christmas", cả hai đều có độ dài ngắn hơn 20 kí tự. 

Do đó, mảng của các kí tự có thể lưu các sequence ngắn hơn so với tổng độ dài của nó, một kí tự đặc biệt đươc sử dụng để báo hiệu kết thúc sequence hợp lệ: the null character, những gì sở hữu literal constant đươc viết như là '\0' (backslash, zero).

Mảng của chúng ta có 20 phần tử kiểu char, được gọi là jenny , khi lưu trữ "hello world" và "Merry christmas" thì có thể được biểu diễn như sau:


Chú ý rằng cách null character được thêm vào sau nội dung hợp lệ để ám chỉ kết thúc sequence. Các panels màu nâu là các char elements với các giá trị chưa được xác định. 

Initialization of null-terminated character sequences

Bởi vì mảng của các kí tự là các mảng thông thường nên chúng tuân theo các luật của mảng. Cho ví dụ, nếu bạn muốn khởi động một mảng các kí tự với một thứ tự các kí tự đã được định nghĩa trước, bạn có thể làm việc này như bất cứ mảng nào khác:


char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

Trong trường hợp này chúng ta khai báo một mảng có 6 phần tử kiểu kí tự, khởi tạo với các kí tự trong "hello" và thêm null character "\0" vào cuối. 

Nhưng mảng các kí tự có thêm những phương thức để khởi tạo giá trị của họ: sử dụng string literals. 
String literals cho ví dụ :


"the result is: "

String literals được bao bởi "" thường xuyên có null character ('\0') tự động nối sau đuôi. 

Do đó chúng ta có thể khởi tạo mảng các kí tự được gọi là myword với null character bằng một trong hai phương thức sau:

char myword [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword [] = "Hello"; 
Trong cả hai trường hợp mảng của các kí tự myword  được khai báo với kích thước là 6 phần tử, 5 kí tự được soạn cho "hello" và thêm vào kí tự cuối cùng là '\0' những gì chỉ ra là tận cùng của sequence. Trong trường hợp thứ 2, khi sử dụng "" thì null character tự động được nối vào. 
Chý ý rằng chúng ta đang nói về khởi tạo một mảng các kí tự, như là nó được khai báo, chứ ta không nói về việc gán giá trị đến chúng mỗi khi chúng được khai báo. Sự thực, bởi vì kiểu mảng kết thúc bởi null character là các mảng thông thường chúng ta có một vài giới hạn như đối với các mảng khác, vì vậy chúng ta không thể copy blocks of data với phép gán. 
Giả sử mytest  là một char[] variable, một expression trong source code giống như:
mystext = "Hello";
mystext[] = "Hello";

là không hợp lệ, muốn hợp lệ nó phải như sau 

 
mystext = { 'H', 'e', 'l', 'l', 'o', '\0' };
Nguyên nhân có thể được giải thích nếu bạn có hiểu biết về con trỏ, bởi vì sau đó nó sẽ được làm rõ rằng thực chất một mảng là một constant pointer trỏ đến môt block of memory. 

Using null-terminated sequences of characters

Null-terminated sequences of characters là một cách tự nhiên để "treating" strings trong C++ , vì vật chúng có thể được sử dụng trong nhiều thủ tục. Thực tế, regular string literals có kiểu đó (char []) và còn được sử dụng trong nhiều trường hợp. 

Cho ví dụ cin cout support null-terminated sequences như là containers hợp lệ cho sequences of characters, vì vậy bạn có thể sử dụng chúng trực tiếp để extract strings của các kí tự từ cin hoặc chèn thêm chúng vào trong cout. cho ví dụ:

// null-terminated sequences of characters
#include <iostream>
using namespace std;

int main ()
{
  char question[] = "Please, enter your first name: ";
  char greeting[] = "Hello, ";
  char yourname [80];
  cout << question;
  cin >> yourname;
  cout << greeting << yourname << "!";
  return 0;
}
Please, enter your first name: John
Hello, John!
Như chúng ta có thể thấy, chúng ta khai báo 3 mảng kí tự. Hai mảng đầu được khởi tạo với string literals constant, trong khi mảng thứ 3 thì chưa định nghĩ, đơn thuần chỉ là khai báo một mảng có 80 kí tự. Kích thước của 2  mảng đầu được xác định là độ dài của literal constant chúng khởi tạo. 

Cuối cùng, sequences of characters được lưu trong mảng char có thể dễ dàng chuyển đổi sang string objects bởi việc sử dụng phép gán.

string mystring;
char myntcs[]="some text";
mystring = myntcs;

Không có nhận xét nào:

Đăng nhận xét