So sánh 2 xâu có giống nhau hay ko năm 2024

Để xử lý văn bản, Pascal đưa ra một kiểu dữ liệu mới gọi là chuỗi hoặc xâu ký tự và được định nghĩa bằng từ khóa String. Xâu ký tự là dữ liệu bao gồm một dãy các ký tự trong bảng mã ASCII.

Khai báo:

Var  : String[<Độ dài tối đa>];

Với cách khai báo này, độ dài của xâu được quy định bởi

Program exString;
Var greetings : String;
    name : String[30];
    organisation : String[10];
    message : String[100];
Begin
   greetings := 'Hello ';
   message := 'Good Day!';
   Writeln('Please Enter your Name');
   Readln(name);
   Writeln('Please Enter the name of your Organisation');
   Readln(organisation);
   Writeln(greetings, name, ' from ', organisation);
   Writeln(message); 
End.

5.

Program exString;
Var greetings : String;
    name : String[30];
    organisation : String[10];
    message : String[100];
Begin
   greetings := 'Hello ';
   message := 'Good Day!';
   Writeln('Please Enter your Name');
   Readln(name);
   Writeln('Please Enter the name of your Organisation');
   Readln(organisation);
   Writeln(greetings, name, ' from ', organisation);
   Writeln(message); 
End.

5 nhận các giá trị nguyên trong đoạn

Program exString;
Var greetings : String;
    name : String[30];
    organisation : String[10];
    message : String[100];
Begin
   greetings := 'Hello ';
   message := 'Good Day!';
   Writeln('Please Enter your Name');
   Readln(name);
   Writeln('Please Enter the name of your Organisation');
   Readln(organisation);
   Writeln(greetings, name, ' from ', organisation);
   Writeln(message); 
End.

7. Trên bộ nhớ, byte đầu tiên chứa số ký tự hiện có của xâu, các byte sau ghi giá trị của từng kí tự trong xâu. Độ dài tối đa của xâu ký tự là 255. Kiểu String có thể chiếm tối đa 256 byte bộ nhớ. Ngoài ra còn có cách khai báo xâu ngắn gọn hơn như sau:

Với cách khai báo này, Pascal tự hiểu là độ dài tối đa có giá trị là 255.

Nhập/xuất

Cách đọc hay viết kiểu String cũng tương tự như các kiểu dữ liệu khác, ta sử dụng các thủ tục , hoặc .

Ví dụ:

Program exString;
Var greetings : String;
    name : String[30];
    organisation : String[10];
    message : String[100];
Begin
   greetings := 'Hello ';
   message := 'Good Day!';
   Writeln('Please Enter your Name');
   Readln(name);
   Writeln('Please Enter the name of your Organisation');
   Readln(organisation);
   Writeln(greetings, name, ' from ', organisation);
   Writeln(message); 
End.

Sau khi đoạn code trên được biên dịch và thực thi thì sẽ cho ra kết quả nhau sau:

Please Enter your Name John Smith Please Enter the name of your Organisation Infotech Hello John Smith from Infotech

Truy xuất

Xâu kí tự có thể được xem như mảng 1 chiều các phần tử có kiểu dữ liệu là Char. Truy cập từng phần tử của xâu ký tự tương tự mảng 1 chiều:

Cách đơn giản và thô sơ nhất là dùng toán tử so sánh của PHP (comparison operators). Tuy nhiên không nên dùng toán tử Equal (

 

  1. mà nên dùng toán tử Identical (

 

1). Bởi vì

 

0 không so sánh kiểu dữ liệu và có thể dẫn đến sai lệch trong việc so sánh. Ta hãy xem thử ví dụ sau:

Viết ngắn sử dụng toán tử 3 ngôi (ternary operator):

 

Mặc dùng

 

3 và

 

4 hoàn toàn khác nhau nhưng kết quả trả về là

 

5 thay vì

 

6. Bởi vì khi PHP sẽ ngầm định ép kiểu về

 

7 để so sánh, và ép kiểu chuỗi ‘defaultpassword’ về kiểu float thì nó sẽ ra kết quả như sau:

 

8 Xem thêm

Do đó khi so sánh 2 chuỗi

 

9 và

 

0 bằng phép toán

 

0 ta được kết quả là true.

 

Nhưng nếu dùng toán tử === ta sẽ được kết quả là false:

 

Do

 

9 tương đương

 

0 nếu như convert sang kiểu

 

7. Vì vậy tốt hơn hết là ta dùng toán tử Identical (

 

  1. để so sánh hai chuỗi.

Sử dụng hàm strcmp()

 

6 Nhận hai tham số

 

7 và

 

8 và trả về kết quả:

  1. 9 nếu như

    0
  2. 1 nếu như

    2
  3. 3 nếu như

    4

Đây là một hàm binary-safe, tức là nhận dữ liệu đầu vào như dữ liệu thô mà không ngầm định kiểu dữ liệu. Và hàm strcmp chỉ so sánh nội dung của hai chuỗi mà không phải so sánh địa chỉ bộ nhớ và bỏ qua các ký tự đặc biệt. Lưu ý thêm là hàm này có phân biệt hoa thường, nhưng hàm

 

5 thì không.

Ví dụ: Hai chuỗi “string1” và “string1\0\n”, hiển nhiên là không giống nhau. Nếu dùng toán tử so sánh ở trên để kiếm tra thì tất nhiên kết quả trả về sẽ là ‘false’. Tuy nhiên nếu dùng hàm strcmp ta sẽ nhận được kết quả là true vì nội dung hai chuỗi này hoàn toàn giống nhau nếu bỏ đi ký tự đặc biệt trong PHP là \0 và\n. echo (strcmp(‘string1’, ‘string1\0\n’)) ? ‘true’ : ‘false’;

Nhưng lưu ý là PHP có một bug như sau: Nếu dùng strcmp để so sánh một array() và một chuỗi thì kết quả trả về vẫn là 0 (tức là hai “chuỗi” bằng nhau).

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

Mặc dù nó vẫn bung ra Warning như nó vẫn vượt qua vào được bên trong và in ra câu thông báo:”You successfully logged in”

Sử dụng hàm similar_text

 

6

Hàm similar_text nhận 3 tham số, 2 chuỗi đầu vào và một biến chứa kết quả trả về. Kết quả là số phần trăm giống nhau giữa hai chuỗi. Ví dụ:

 

Kết quả trả về là

 

7 Theo document của PHP, hàm này tính toán sự giống nhau giữa hai chuỗi được được mô tả trong sách Programming Classics: Implementing the World’s Best Algorithms by Oliver (ISBN 0-131-00413-1).

Tuy nhiên thứ tự của các tham số cũng khiến thay đổi kết quả trả về, và ví dụ dưới đây được báo cáo là một bug nhưng chưa được xác nhận

 

Sử dụng hàm levenshtein

Hàm này ngược lại với hàm

 

8, nó sẽ trả về 0 nếu như hai chuỗi so sánh giống hệt nhau:

 

Hàm này tính khoảng cách levenshtein (hay còn gọi là Edit distance) giữa 2 dãy (sequence) và được đặt tên theo một nhà khoa học người Nga Vladimir Levenshtein người đã nghĩ ra ý tưởng này vào năm 1965. Khoảng cách levenshtein được tính bằng cách tính số lần xóa (deletions), thêm (insertions) và thay thế (substitutions) để chuyển chuỗi gốc (source) thành chuỗi đích (target).

Ví dụ: Khoảng cách Levenshtein giữa 2 chuỗi “kitten” và “sitting” là 3, vì phải dùng ít nhất 3 lần biến đổi.

  • kitten -> sitten (thay “k” bằng “s”)
  • sitten -> sittin (thay “e” bằng “i”)
  • sittin -> sitting (thêm kí tự “g”)

 

Sử dụng hàm soundex

 

9

Hàm này sử dụng thuật toán ngữ âm (phonetic algorithm) để tính toán chỉ mục của các tự dựa trên cách phát âm của nó (theo tiếng Anh). Hàm này trả về một chuỗi 4 ký tự bắt đầu với một chữ cái. Thuật toán này được mô tả trong cuốn nổi tiếng The Art Of Computer Programming, vol. 3: Sorting And Searching”, Addison-Wesley (1973), pp. 391-392 của Donald Knuth.

Ví dụ: Trong MySQL có một hàm tương tự . Ta có thể dùng hàm này để đưa ra tìm không gần đúng một keyword. Ta lưu trong database 1 trường soundex, để so sánh với keyword người dùng đưa vào:

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

0

Sử dụng hàm metaphone

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

1

Theo PHP document thì hàm này tương tự như soundex nhưng chính xác hơn vì dựa vào nguyên tắc phát âm cơ bản trong tiếng Anh. Và hàm này trả về một khóa có chiều dài thay đổi theo chiều dài của chuỗi đầu vào. Thuật toán này được phát triển bởi Lawrence Philips và được mô tả trong cuốn “Practical Algorithms for Programmers”, Binstock & Rex, Addison Wesley, 1995.

 

Trong khi dùng hàm soundex sẽ trả về 2 kết quả khác nhau

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

2 (Catherine) và

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

3 (Katherine). Ở đây ta có thể thấy tại sao hàm

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

4 được mô tả là chính xác hơn hàm

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

5, theo nghĩa nó có ích hơn vì trên thực tế hai Katherine và Catherine đọc hoàn toàn giống nhau. Cũng tương tự như

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

5, ta có thể sử dụng hàm

 

Warning: strcasecmp() expects parameter 1 to be string, array given in cmpstr.php on line 12

4 để tăng khả năng tìm kiếm trong database.